设置
我有一个分布式系统模型,其中有一个生产者(P)、一个消费者(C)和 1、2、3、... n 个工人(Wn)。所有这些组件都通过 Microsoft Azure 服务总线 (B) 进行通信。在总线内部,有一个主题(T)和一个队列(Q)。
(P) 以不同的速率将消息推送到 (T)。(Wn) 的 [它们的数量是 (P) 的消息速率的结果] 正在从那里获取这些消息,根据一些预定义的函数更改它们,然后将消息转发到 (Q ), (C) 从中提取并按计划进行处理。
目的
此模型的目的是研究此类系统的可伸缩性,并特别关注 Azure 服务总线。应用程序本身是用 C# 编写的,它们都在同一个系统中执行。
问题
关于 Azure 服务总线的功能,我有两个担忧:
- 有没有办法告诉(B)在平衡方面更宽松,或者让(W)更“渴望”参与?
消息分发似乎有一个预定的顺序,使得负载平衡不均匀(在(W)之间)。
比如说我有 3 个 (W) 或 (W3):如果 (P) 现在要向 (T) 发送 1.000 条消息,我希望分布均匀,接近所有消息的 1/3 (W) 中的每一个。然而事实并非如此;似乎 (W) 的其余部分只是坐在那里等待忙碌的 (W) 一个接一个地处理消息。突然,也许在 15 到 20 条消息之后,另一个(W)会收到一条消息,但仍然很不平衡。
因此,我现在 (W) 只是无所事事地坐着(在不同的时间段内)。
- 有没有办法在(B)的设置或(W)的代码中专门设置 PeekLock() 的时间?
我在 (W) OnMessage() 函数中尝试了 Thread.Sleep(timeToSleep)。如果不是因为第一个问题中表达的担忧,这似乎符合我的需求。
我的实验:每当一条消息到达 (W) 时,工作就开始了,就在 message.Complete() 被发送到 (B) 之前,我拉出一个 Thread.Sleep(2000) 或类似的东西。理想情况下,另一个(W)应该在第一个(W)睡着的地方接听,但他们没有。第一个 (W) 醒来并抓取另一条消息,因此循环继续,有时 15-20 次,直到另一个 (W) 最终抓取一条消息。
图片
如果你原谅我在通过绘图解释时的努力,这是当前的场景(图 1)和理想的、想要的场景(图 2):
我希望对这个问题有所澄清。先感谢您!