Azure Service Bus负载均衡不均衡

时间:2017-04-05 07:36:04

标签: c# azure servicebus distributed-system brokeredmessage

设置

我有一个分布式系统的模型,其中有一个生产者(P),一个消费者(C)和1,2,3,...... n个工人(Wn)。所有这些组件都通过Microsoft Azure Service Bus(B)进行通信。在总线内部,有一个主题(T)和一个队列(Q)。

(P)以不同的速率将消息推入(T)。 (Wn)的[它们的数量是(P)消息速率的结果]从那里获取这些消息,根据一些预定义的函数改变它们,然后将消息转发给(Q) ),(C)从中拾取并按计划处理它们。

目的

此模型的目的是调查此类系统的可伸缩性,并特别关注Azure Service Bus。应用程序本身是用C#编写的,它们都是在同一系统中执行的。

问题

关于Azure Service Bus的功能,我有两个问题:

  1. 有没有办法告诉(B)在平衡方面更松散,或者让(W)更“渴望”参与?
  2. 似乎有一个预先指定的消息分配顺序,使负载平衡不均匀(在(W)之间)。

    比如说我有3个(W) - 或者(W3):如果(P)现在要向(T)发送1.000个消息,我会期望有点均匀分布,朝向1/3每个(W)的所有消息。然而事实并非如此;似乎其余的(W)只是坐在那里等待忙(W)处理消息之后的消息。突然,也许在15到20条消息之后,另一条(W)会收到一条消息,但是余额仍然很不平衡。

    因此,我现在(W)只是无所事事地坐着(在不同的时间段内)。

    1. 在(B)的设置或(W)的代码中有没有办法专门设置PeekLock()的时间?
    2. 我在(W)OnMessage() - 函数中尝试过Thread.Sleep(timeToSleep)。这似乎符合我的需要,如果不是因为在第一个问题中播出的问题。

      我的实验:每当一条消息到达(W)时,工作就开始了,就在message.Complete()被发送到(B)之前,我拉出一条Thread.Sleep(2000)或者那条线上的东西。理想情况下,另一个(W)应该在第一个(W)睡着的地方拿起,但他们不会。第一个(W)唤醒并抓取另一个消息,因此循环继续,有时15-20次,直到另一个(W)最终抓取消息。

      图片

      如果您原谅我通过绘图解释的不良努力,这是当前的情况(图1)和理想的,想要的情景(图2):

      Figure 1: current scenario

      Figure 2: optimal/wanted scenario

      我希望对此事做一些澄清。提前谢谢!

1 个答案:

答案 0 :(得分:0)

跨消费者的消息分发是按照向服务总线发出消息请求的顺序处理的。无法确保在消息级别进行令人兴奋的均匀分发,并且分发将受到功能使用的影响,包括预取。在任何实际的工作负载情况下,您会发现分发是公平的,因为繁忙的工作人员不会要求更多的消息。