【问题标题】:Load-balancing multiple topic subscriptions across nodes of cluster跨集群节点负载均衡多个主题订阅
【发布时间】:2014-04-23 10:43:48
【问题描述】:
我们的应用程序订阅了一个主题列表,这些主题可以动态添加/删除。我们计划拥有这样的应用程序节点集群,以便每个节点都可以订阅不同的主题集;类似于集群中节点间的负载均衡订阅。我们不能在多个节点上订阅相同的主题,因为我们需要避免跨节点重复处理相同的消息。
下面有什么解决办法:
- 如果我们必须订阅一个新主题,具有较小的节点
load(较少的主题订阅)将订阅此主题。
- 当一个节点下线时,它的所有主题都将被集群中其他活跃的节点订阅。
Zookeeper 是否可以用于此目的来协调跨节点的信息?
【问题讨论】:
标签:
java
load-balancing
distributed-computing
publish-subscribe
apache-zookeeper
【解决方案1】:
尝试制作一个负载平衡器应用程序来执行负载平衡操作,并且它应该连接到两个节点。它将定期对两个节点进行健康检查,并以循环方式转发订阅请求。如果一个节点出现故障,它将通过定期的健康检查得到提示,然后它将订阅请求转发到一个连接的节点。您可以使用 Netty API 来制作使用 TCP/IP 连接的负载均衡器。
【解决方案2】:
是的,Zookeeper 可以用来实现这个逻辑。看看 Apache Helix Rabbit MQ 配方,它做了类似的事情。
http://helix.apache.org/0.6.4-docs/recipes/rabbitmq_consumer_group.html
这解释了单个主题的逻辑。 Helix 将主题/分区分布在集群中的所有节点上。如果您想限制分配分区的节点,您可以相应地标记资源和节点。
例如,如果您有节点 A、B、C、D、E、F
如果您希望主题 T1,T2 仅在 A 和 B 上,您可以将 A 和 B 标记为 X,并将 Helix 中的资源 T1 和 T2 标记为 X。Helix 将确保仅订阅 T1 和 T2由 A 和 B.
注意:Helix 中的一个节点/实例可以有多个标签。 1 和 2 应该由 Helix 自动处理