服务发现、负载均衡和连接池方法

service discovery, load balancing and connection pooling approach

当为像 AWS 这样部署在云上的大型系统部署 SOA 时,有两种方法可用于服务交互。

  1. 让每个服务集群都在内部 elb 后面。客户端与相应的elb建立连接池,elb进行循环平衡。

  2. 采用像 netflix eureka 这样的服务发现方法。

目前我们使用第一种方法,其中每个服务集群都在内部 elb 后面,客户端通过 elb 进行通信,因此每个客户端实例只需维护 1 个池,即 elb 端点。

我对第二个方法有以下疑问。

  1. 转向服务发现和智能客户端架构是否有好处,其中服务客户端知道所有服务实例(通过 eureka 服务或等效服务)并进行内部负载平衡?
  2. 在上述情况下,连接池是如何工作的?当前,每个客户端实例必须恰好维护 1 个连接池,即与相应服务的 elb。但是对于富客户端,每个客户端都将拥有所有服务实例端点以直接与之通信。在每个请求上建立连接效率不高,我想每个客户端有这么多连接池(每个服务实例 1 个)是一种矫枉过正。

以上两个问题inputs/suggestions

第一个问题。

是的。首先,您可以进行更好的故障恢复——例如,在不向客户端显示任何错误的情况下重试对另一个节点的失败请求。接下来,您可以比 ELB 提供更好的平衡。接下来,您可以自动 add/remove 节点 to/from 集群 w/o 更改 ELB 配置。如果您的节点有健康检查,这将非常有用。更重要的是,软件平衡器可以快速做到这一点。

第二个问题。

每个节点都有连接池。 IE。 [api 客户端代码中的方法] -> [软件平衡器] -> [节点连接池] -> [节点连接] -> [使用此连接发出请求]