Azure 服务总线负载均衡不均衡



Setup

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

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

目的

此模型的目的是调查此类系统的可伸缩性,并具体考虑 Azure 服务总线。应用程序本身是用 C# 编写的,它们都在同一系统中执行。

问题

我对 Azure 服务总线的功能有两个顾虑:

  1. 有没有办法告诉(B)在平衡方面更加宽松,或者让(W)更"渴望"参与?

消息分发似乎有一个预定的顺序,使得负载平衡不均匀(在 (W) 之间)。

例如,假设我有 3 (W) 的 - 或 (W3):如果 (P) 现在要向 (T) 发送 1.000 条消息,我预计分布会有些均匀,每个 (W) 的消息占所有消息的 1/3。然而,情况并非如此;似乎其余的(W)只是坐在那里等待忙碌的(W)处理一条又一条的消息。突然,也许在 15 到 20 条消息之后,另一个 (W) 会收到一条消息,但平衡仍然非常不平衡。

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

  1. 有没有办法,无论是在 (B) 的设置中还是在 (W) 的代码中,专门设置 PeekLock() 的时间?

我已经在(W)OnMessage()函数中尝试了Thread.Sleep(timeToSleep)。这似乎符合我的需求,如果不是因为第一个问题中提出的担忧。

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

图像

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

图1:当前方案

图 2:最佳/所需方案

我希望对此事作出一些澄清。提前谢谢你!

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

最新更新