云原生环境中的连接池

Connection pooling in cloud native environment

云原生环境还需要连接池吗?

连接池(例如打开的数据库连接)在过去非常流行。

我猜(不知道)在云原生环境中不再需要它们。

有一池 containers/pods。这样几乎不再需要连接池了。

这是真的吗?

您仍然需要连接池。

连接池可防止您在发送 HTTP 请求到其他服务时产生 TCP 连接建立开销。我相信这大约是两个往返时间 (RTT) (SYN -> <- SYN-ACK -> ACK)。参见 Connection Establishment。网络 I/O 非常耗时,因此这可以节省大量请求时间。

连接池对底层操作系统也很有帮助。例如,在 Kubernetes 上下文中,您可能正在与 "Service" 通信。 Kubernetes 使用 iptables 将流量正确路由到服务。 iptables 使用名为 conntrack 的文件来跟踪 iptables 管理的所有连接。这是一个大小有限的文件。连接池可以防止您压倒 conntrack 文件。这是相关的 blog post.

一如既往,测量,不要猜测,但是,如果您关心性能,您仍然需要某种方式的连接池。

除了上述原因(TCP 3 次握手),您还需要连接池,原因如下:

  1. 数据库可能需要为每个连接分叉或启动一个新进程,这可能是一个非常昂贵的操作
  2. 关闭连接后,操作系统可能必须清理数据库进程以保护内存、文件描述符、套接字等。
  3. 数据库可能需要验证用户的登录凭据,在某些情况下可能是 LDAP 用户帐户,因此涉及另一个网络往返
  4. 如果您的连接不是普通 TCP 连接,但您在最坏的情况下使用 SSL/TLS(无法恢复会话),您可能会产生完整 TLS 握手的开销,包括验证 RSA 签名和检查通过互联网上的 CRL 或 OCSP 的证书状态

我们专业地使用它,并且:

  • 池化 httpclients(用于 REST/SOAP 网络服务)
  • 汇集与 RabbitMQ 的连接(RabbitMQ 监视器提供对他们所谓的深入了解:流失统计信息,以轻松查看建立新连接的频率)

您可能还想查看其他 'cloud architecture solutions',例如:Istio is an implementation that try to decouple this kind of concerns from your application in a microservice architecture. These may use a local proxy server with connection pooling in the so called 'Side car pattern'. For a more complete explanation see: Red Hats explanation of a Service Mesh

的服务网格