MSMQ或MQ系列循环负载平衡

时间:2015-02-03 15:58:38

标签: load-balancing msmq messaging ibm-mq

我有一个场景,我需要实现一个服务器场(比如5台服务器),它将运行4个计算引擎实例:

Server 1: E1 E2 E3 E4
Server 2: E1 E2 E3 E4
Server 3: E1 E2 E3 E4
Server 4: E1 E2 E3 E4
Server 5: E1 E2 E3 E4

我想利用一个消息队列解决方案,每个引擎都在同一个队列(例如WORK.QUEUE)上监听传入的工作。在初始状态,如果添加工作,那么我希望它转到Server-1 / E1。然后,如果在该实例繁忙时有更多工作到达,我希望它转到Server-2 / E1等等。如果所有E1实例都可用,我只想工作去E2实例。

这听起来像是一种循环负载平衡的形式,但我怀疑这不是消息排队空间中的正确术语。

这种架构是否可以使用MSMQ或MQ Series,或者它是否需要在每台服务器上运行某种负载均衡器以在服务器级别上分配工作?

2 个答案:

答案 0 :(得分:1)

消息的循环负载平衡当然是消息传递领域的一个术语。在IBM WebSphere MQ(又名MQSeries)的情况下,这意味着每条新消息都将转到队列的新实例,即

Message 1 -> Server-1/E1
Message 2 -> Server-2/E1
Message 3 -> Server-3/E1
Message 4 -> Server-4/E1

即。它不是基于每台服务器上消费者的忙碌。

答案 1 :(得分:0)

MSMQ只是传递消息。它不关心工作量。

您描述的方案是多个读者访问单个公共远程队列。任何负载平衡都需要由您自己的代码执行。

一种方法可能是拥有多个队列和一个简单的服务,如果未在设定的时间内处理,则将消息从WORK.QUEUE移动到WORK.QUEUE2。所有E1实例都将从WORK.QUEUE读取消息,从WORK.QUEUE2读取E2实例,从WORK.QUEUE3读取E3,依此类推。如果一个级别的所有实例都忙,则会在队列中按下/级联消息,直到它被处理完毕。

类似于WCF和MSMQ子队列的工作方式。