NServiceBus命令处理程序中的生产者/消费者

时间:2019-04-09 10:32:14

标签: c# .net nservicebus producer-consumer

因为NServiceBus似乎不支持在消息队列中添加优先级机制,所以我想自己实现。

  • 命令处理程序(生产者):
public void Handle(DoAnAction message)
{
  _messageManager.Insert(message);
}
  • 单个使用者(不同线程):
public void Run()
{
  DoAnAction message;
  while (true) 
  {
    if (_messageManager.TryDequeue(out message)) 
    {
      doALongCall(message);
    }
    else 
    {
      Thread.sleep(200);
    }
  }
}

这是一个好主意吗?我不喜欢这样丢失消息的想法。

更新:用例:我们有许多客户可以发送消息DoAnAction。该操作的处理需要一段时间。问题是当1个客户端决定发送200个DoAnAction时,所有其他客户端都必须等待2-3个小时,以便可以处理所有这些消息(FIFO)。 相反,我想根据客户端的顺序处理这些消息。

因此,即使客户端A仍有200条消息要处理,当客户端B发送消息时,下一个也会排队。 如果客户端B发送3条消息,则队列如下所示: B-A,B-A,B-A,A,A,A,...

2 个答案:

答案 0 :(得分:2)

通常,我发现这样做的真正原因是出于商业角度。在这种情况下,有必要在代码中对其进行建模以反映围绕业务的规则和规定。

假设您有一条SendEmail消息,但您想根据目标客户“优先”处理某些消息。您可以对系统进行不同的设计,以便拥有两种消息类型,一种是常规SendEmail,另一种是称为SendPriorityEmail的消息,它们将到达不同的端点/队列。您需要在代码中确定要发送的消息。

从根本上分离消息意味着您具有更大的灵活性(这也来自业务),这对于进行监控,SLA和更重要的客户的服务质量(在这种情况下)很有用

答案 1 :(得分:0)

您可以使用Sagas来完成所需的工作,每个客户端ID基本上都有一个传奇实例。传奇充当“阻塞点”,并且可以确保每个客户端一次仅处理N条消息。

这可能会在较低负载水平下将吞吐量降低到最大容量以下,但可能会导致您试图实现更“公平”的分配。

这有意义吗?