Obecně jste na správné cestě a vaše analýza se zdá být přesná. Některé komentáře:
Možnost 2 (ukončení udržování života) pomůže odstranit nečinná připojení ve fondu Npgsql, která byla přerušena. Jak jste napsali, vaše aplikace bude stále selhat (protože některá špatná nečinná připojení nemusí být včas odstraněna). Neexistuje žádný konkrétní důvod si myslet, že by to způsobilo další problémy – zapínání by mělo být docela bezpečné.
Možnost 3 je pro perf skutečně problematická, protože TCP spojení s pgbouncer by muselo být vytvořeno pokaždé, když je potřeba připojení k databázi. Neposkytne ani 100% mechanismus odolný proti selhání, protože pgbouncer může stále vypadnout, když je připojení používáno.
Na konci dne se ptáte na odolnost tváří v tvář svévolnému selhání sítě/serveru, čehož není snadné dosáhnout. Jediný 100% spolehlivý způsob, jak se s tím vypořádat, je ve vaší aplikaci prostřednictvím vyhrazené vrstvy, která by opakovala operace, když dojde k přechodné výjimce. Možná se budete chtít podívat na Polly
a všimněte si, že Npgsql nám trochu pomáhá tím, že odhaluje IsTransient
výjimku, kterou lze použít jako spouštěč pro opakování (Entity Framework Core také zahrnuje podobnou „strategii opakování“). Pokud se vydáte touto cestou, mějte na paměti, že transakce je obzvláště obtížné správně zpracovat.