使用Zookeeper和Thrift加载平衡服务

时间:2011-10-09 08:42:38

标签: java load-balancing distributed-computing thrift apache-zookeeper

我们有一个计算密集型服务,用于进行大量转换。它在很大程度上受计算限制(CPU绑定)进程。基本上发生的事情是我们有一个消息代理,它通过Thrift将消息发送到处理服务。

现在我们有多个不同的处理服务,它们运行不同的算法来处理消息 - 这些消息被路由到一个或多个处理算法。我们的消息量是可变的,处理算法的需求也是可变的(即我们可以获得包含XYZ的许多消息,然后发送到算法1,否则发送到算法2)。

我们希望将其扩展为可横向扩展的内容。所以我们有多个节点正在运行处理算法。现在,根据消息传递负载,我们的Thrift请求应该发送到不同的服务器(假设所有服务都运行每个处理Algo1到3的实例)。比如我们想要在Algo 1上处理大量消息,然后我们有两台运行algo 1的服务器,第三台服务器负责处理其他两个algos(Algo 2& 3)的请求。

所以系统看起来像这样:

Client ----Request-------|
              -----------|--------------------
              | Coord & Load Balancer Service | ... like zookeeper
               --------------------------------
                      <--|-->
                         |    Route messages to servers...
   Server1:               Server2:          Server 3:
Algo1 instance        Algo1 instance      Algo2 instance
                                          Algo3 instance    

所有进程都是用Java编写的。

因此,使用Zookeeper进行设置是多么容易。我知道,当我们添加或更改algos时,我们可以轻松地使用Zookeeper来处理事物的配置方面(即服务器侦听算法更新或添加并按配置提供服务)但是我们如何管理负载平衡方面?

干杯!

2 个答案:

答案 0 :(得分:6)

你们可能想要一些来自LinkedIn的Norbert:http://sna-projects.com/norbert/ 它们在客户端和服务器之间使用持久的对等通信,并使用zookeeper进行服务注册和带外信令。 很酷的东西。 它使您能够启动另一个处理节点,该节点可以帮助在高负载期间处理请求。

/ Jonas

答案 1 :(得分:2)

看看DynamicPool和ZooKeeperNode。 ThriftFactory中提供了默认接线供参考。 http://twitter.github.com/commons/