【发布时间】:2017-04-05 17:21:41
【问题描述】:
设置
我有一个分布式系统模型,其中有一个生产者(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):
Figure 2: optimal/wanted scenario
我希望对此事作出一些澄清。提前谢谢!
【问题讨论】:
标签: c# azure servicebus distributed-system brokeredmessage