Anda umumnya berada di jalur yang benar dan analisis Anda tampaknya akurat. Beberapa komentar:
Opsi 2 (mengubah keepalives) akan membantu menghapus koneksi idle di kumpulan Npgsql yang telah rusak. Saat Anda menulis aplikasi Anda masih akan mengalami beberapa kegagalan (karena beberapa koneksi menganggur yang buruk mungkin tidak dapat dihapus tepat waktu). Tidak ada alasan khusus untuk berpikir ini akan menyebabkan masalah lebih lanjut - ini seharusnya cukup aman untuk diaktifkan.
Opsi 3 memang bermasalah untuk perf, karena koneksi TCP ke pgbouncer harus dibuat setiap kali koneksi database diperlukan. Ini juga tidak akan menyediakan mekanisme anti-gagal 100%, karena pgbouncer mungkin masih putus saat koneksi sedang digunakan.
Pada akhirnya, Anda bertanya tentang ketahanan dalam menghadapi kegagalan jaringan/server yang sewenang-wenang, yang bukan hal yang mudah untuk dicapai. Satu-satunya cara yang 100% andal untuk menangani ini adalah dalam aplikasi Anda, melalui lapisan khusus yang akan mencoba kembali operasi ketika pengecualian sementara terjadi. Anda mungkin ingin melihat Polly
, dan perhatikan bahwa Npgsql sedikit membantu kami dengan mengekspos IsTransient
pengecualian yang dapat digunakan sebagai pemicu untuk mencoba lagi (Entity Framework Core juga menyertakan "strategi coba lagi" yang serupa). Jika Anda menempuh jalan ini, perhatikan bahwa transaksi sangat sulit ditangani dengan benar.