我有一个分布式系统的模型,其中有一个生产者(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的功能,我有两个问题:
似乎有一个预先指定的消息分配顺序,使负载平衡不均匀(在(W)之间)。
比如说我有3个(W) - 或者(W3):如果(P)现在要向(T)发送1.000个消息,我会期望有点均匀分布,朝向1/3每个(W)的所有消息。然而事实并非如此;似乎其余的(W)只是坐在那里等待忙(W)处理消息之后的消息。突然,也许在15到20条消息之后,另一条(W)会收到一条消息,但是余额仍然很不平衡。因此,我现在(W)只是无所事事地坐着(在不同的时间段内)。
我在(W)OnMessage() - 函数中尝试过Thread.Sleep(timeToSleep)。这似乎符合我的需要,如果不是因为在第一个问题中播出的问题。
我的实验:每当一条消息到达(W)时,工作就开始了,就在message.Complete()被发送到(B)之前,我拉出一条Thread.Sleep(2000)或者那条线上的东西。理想情况下,另一个(W)应该在第一个(W)睡着的地方拿起,但他们不会。第一个(W)唤醒并抓取另一个消息,因此循环继续,有时15-20次,直到另一个(W)最终抓取消息。
如果您原谅我通过绘图解释的不良努力,这是当前的情况(图1)和理想的,想要的情景(图2):
Figure 2: optimal/wanted scenario
我希望对此事做一些澄清。提前谢谢!
答案 0 :(得分:0)
跨消费者的消息分发是按照向服务总线发出消息请求的顺序处理的。无法确保在消息级别进行令人兴奋的均匀分发,并且分发将受到功能使用的影响,包括预取。在任何实际的工作负载情况下,您会发现分发是公平的,因为繁忙的工作人员不会要求更多的消息。