En general, está en el camino correcto y su análisis parece preciso. Algunos comentarios:
La opción 2 (resultar keepalives) ayudará a eliminar las conexiones inactivas en el grupo de Npgsql que se han roto. Como ha escrito, su aplicación aún tendrá algunas fallas (ya que es posible que algunas conexiones inactivas defectuosas no se eliminen a tiempo). No hay ninguna razón particular para pensar que esto podría causar más problemas; debería ser bastante seguro activarlo.
La opción 3 es realmente problemática para perf, ya que tendría que establecerse una conexión TCP con pgbouncer cada vez que se necesita una conexión a la base de datos. Tampoco proporcionará un mecanismo 100% a prueba de fallas, ya que pgbouncer aún puede desconectarse mientras se usa una conexión.
Al final del día, está preguntando acerca de la resiliencia frente a fallas arbitrarias de red/servidor, lo cual no es algo fácil de lograr. La única forma 100% confiable de lidiar con esto es en su aplicación, a través de una capa dedicada que reintentaría las operaciones cuando ocurra una excepción transitoria. Es posible que desee consultar Polly
, y tenga en cuenta que Npgsql nos ayuda un poco al exponer un IsTransient
excepción que se puede usar como desencadenante para volver a intentarlo (Entity Framework Core también incluye una "estrategia de reintento" similar). Si sigue este camino, tenga en cuenta que las transacciones son particularmente difíciles de manejar correctamente.