2

设置

我有一个分布式系统模型,其中有一个生产者(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 条消息,我希望分布均匀,接近所有消息的 1/3 (W) 中的每一个。然而事实并非如此;似乎 (W) 的其余部分只是坐在那里等待忙碌的 (W) 一个接一个地处理消息。突然,也许在 15 到 20 条消息之后,另一个(W)会收到一条消息,但仍然很不平衡。

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

  1. 有没有办法在(B)的设置或(W)的代码中专门设置 PeekLock() 的时间?

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

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

图片

如果你原谅我在通过绘图解释时的努力,这是当前的场景(图 1)和理想的、想要的场景(图 2):

图 1:当前情景

图 2:最佳/想要的场景

我希望对这个问题有所澄清。先感谢您!

4

1 回答 1

0

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

于 2017-04-05T09:21:41.437 回答