【问题标题】:When is the distributor storage queue get cleared分发器存储队列何时被清除
【发布时间】:2012-12-11 19:43:11
【问题描述】:

我有一个分发器和两个工人,分发器的存储队列中的消息不断增加,每条消息的大小为 2 kb。

我在这里查看了 Udi 的回复 http://tech.dir.groups.yahoo.com/group/nservicebus/message/10698 当分发者向工作节点分发消息时,消息会从分发者的存储队列中清除。 话虽如此,工作节点通常会在之后立即发送就绪消息,从而导致存储队列再次填满。

我不清楚“导致存储队列再次填满”。声明。

我期望分发服务器的存储队列中的最大消息数应该等于工作人员的数量,但事实并非如此。

是否有任何我可能缺少的配置来控制分发器的存储队列清理行为?

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    从 NSB 3.3.2 开始,存在一个已知问题,https://github.com/NServiceBus/NServiceBus/issues/806,在分发者场景中使用 SendLocal 的 worker。这将导致工作人员在每次处理本地发送的消息时发送“准备好接收新消息”。这使得分发者存储队列增长到高于所有工作线程上所有工作线程总和的预期最大值。如果您在本地发送大量消息并且存储队列中的条目数量增长非常大,这可能会成为问题。

    解决方法:

    1. 从 SendLocal 切换到 Send
    2. 重启worker(这将重置存储,但它会为worker上的每个SendLocal重新建立

    SLR(二级重试)功能(https://github.com/NServiceBus/NServiceBus/issues/571)也存在类似问题,但已在 3.2.7 中修复。

    【讨论】:

      【解决方案2】:

      当 worker 重新启动时,队列将被清除。我猜你是在 2.x 下运行的,我记得队列中的消息数量是工人数量的两倍。我不记得确切的原因,但它并没有真正影响任何事情。

      在 3.x 中,我刚刚验证了每个工人有一条消息,当工人重新启动时,它们将被清除。一旦发生重启,worker 将立即调整并报告其可用性,因此队列将在它恢复后立即在其中包含消息。

      【讨论】:

      • 我使用的是 NSB 3.2.2。我已经解决了这个问题。问题是我使用 SendLocal 向自己发送消息,但在分布式环境中,工作人员正在向分发者发送控制消息,因为每个消息都发送给自己,但不知道为什么。当我停止使用 SendLcal 时,消息不会堆积在分发服务器存储队列中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多