Du er generelt på rette vej, og din analyse virker præcis. Nogle kommentarer:
Mulighed 2 (at vise keepalives) vil hjælpe med at fjerne inaktive forbindelser i Npgsqls pool, som er blevet brudt. Som du har skrevet vil din applikation stadig fejle (da nogle dårlige inaktive forbindelser muligvis ikke fjernes i tide). Der er ingen særlig grund til at tro, at dette ville forårsage yderligere problemer - dette burde være ret sikkert at slå til.
Mulighed 3 er faktisk problematisk for perf, da der skal etableres en TCP-forbindelse til pgbouncer, hver gang en databaseforbindelse er nødvendig. Det vil heller ikke give en 100 % fejlsikker mekanisme, da pgbouncer stadig kan falde ud, mens en forbindelse er i brug.
I slutningen af dagen spørger du om modstandsdygtighed i lyset af vilkårlig netværks-/serverfejl, hvilket ikke er let at opnå. Den eneste 100 % pålidelige måde at håndtere dette på er i din applikation, via et dedikeret lag, som ville prøve operationer igen, når en forbigående undtagelse opstår. Du vil måske se på Polly
, og bemærk, at Npgsql hjælper os lidt ved at afsløre en IsTransient
undtagelse, som kan bruges som en trigger til at prøve igen (Entity Framework Core inkluderer også en lignende "gentag-strategi"). Hvis du går ned ad denne vej, skal du være opmærksom på, at transaktioner er særligt vanskelige at håndtere korrekt.