gpt4 book ai didi

c# - Azure服务总线负载均衡不均匀

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:32 26 4
gpt4 key购买 nike

设置

我有一个分布式系统模型,其中有一个生产者 (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)只是坐着无所事事(在不同的时间段内)。

  • 有没有办法在(B)的设置或(W)的代码中专门设置 PeekLock() 的时间?
  • 我在 (W) OnMessage() 函数中尝试了 Thread.Sleep(timeToSleep)。如果不是因为第一个问题中表达的担忧,这似乎符合我的需求。

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

    图片

    请原谅我在通过绘图进行解释时表现不佳,这是当前场景(图 1)和理想的、想要的场景(图 2):

    Figure 1: current scenario

    Figure 2: optimal/wanted scenario

    我希望对此事进行一些澄清。预先感谢您!

    最佳答案

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

    关于c# - Azure服务总线负载均衡不均匀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224749/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com