Estoy mirando las conexiones agrupadas de NodeJs a Postgresql. Usaré la clase Pool en la biblioteca pg , junto con async / await .
He leído que Postgresql por defecto tiene un límite de 100 conexiones simultáneas y Pool tiene un valor predeterminado de 10 conexiones agrupadas.
Mi aplicación escalará nuevas instancias a medida que se encuentre bajo una gran carga, por lo que, en teoría, podría terminar con más de 10 instancias, lo que superaría las 100 conexiones máximas de Postgresql.
Lo que me gustaría saber es qué sucederá cuando ejecute await pool.Query(....) en las siguientes circunstancias.
Además, ¿cómo puedo escribir un código NodeJS que intente realizar 101 conexiones agrupadas para probar este comportamiento?
Cuando se alcanzan todas las conexiones en un grupo, un nuevo solicitante simplemente bloqueará hasta que alguien más finalice, a menos que se establezca connectionTimeoutMillis, entonces obtendrá un error sintético después del tiempo de espera especificado. esto esta documentado
Cuando se agotan todos los max_connection de PostgreSQL (por varios grupos, por ejemplo), los intentos de obtener una conexión fallarán y volverán al solicitante. Esto no parece estar documentado, y uno podría imaginar que el Pool es más inteligente, por ejemplo, interceptando el error y haciendo que el cliente espere como si se hubiera alcanzado el máximo para ese pool (Pero en ese caso, ¿qué pasaría si fuera el primero? conexión que ese grupo intentó hacer? ¿A qué estaría esperando?), o reintentar la conexión periódicamente para que haya una disponible.
Por lo tanto, le recomendamos que no permita que esto suceda, limitando hasta dónde puede escalar el servidor de aplicaciones o aumentando max_connections en Postgres o reduciendo max en cada grupo.
Cuál de estos tiene sentido depende de las circunstancias. No tiene sentido escalar el servidor de aplicaciones si el cuello de botella está completamente en la base de datos.