U bent over het algemeen op de goede weg en uw analyse lijkt accuraat. Enkele opmerkingen:
Optie 2 (het maken van keepalives) helpt bij het verwijderen van inactieve verbindingen in de pool van Npgsql die zijn verbroken. Zoals je hebt geschreven, zal je applicatie nog steeds enkele storingen vertonen (omdat sommige slechte niet-actieve verbindingen mogelijk niet op tijd worden verwijderd). Er is geen specifieke reden om aan te nemen dat dit verdere problemen zou veroorzaken - dit zou redelijk veilig moeten zijn om in te schakelen.
Optie 3 is inderdaad problematisch voor perf, omdat er telkens een TCP-verbinding met pgbouncer tot stand moet worden gebracht als een databaseverbinding nodig is. Het biedt ook geen 100% storingsbestendig mechanisme, aangezien pgbouncer nog steeds kan uitvallen terwijl een verbinding in gebruik is.
Aan het eind van de dag vraag je naar veerkracht in het licht van willekeurige netwerk-/serverstoringen, wat niet eenvoudig te bereiken is. De enige 100% betrouwbare manier om hiermee om te gaan, is in uw toepassing, via een speciale laag die bewerkingen opnieuw zou proberen wanneer zich een tijdelijke uitzondering voordoet. Misschien wil je kijken naar Polly
, en merk op dat Npgsql ons een beetje helpt door een IsTransient
uitzondering die kan worden gebruikt als een trigger om opnieuw te proberen (Entity Framework Core bevat ook een vergelijkbare "strategie voor opnieuw proberen"). Als u dit pad volgt, houd er dan rekening mee dat transacties bijzonder moeilijk correct af te handelen zijn.