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

and*_*ndy 5 .net c# nservicebus producer-consumer

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

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

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

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

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

Sea*_*mar 0

您可以使用Sagas来完成您想要的操作,本质上每个客户端 ID 都有一个 saga 实例。该传奇充当“阻塞点”,可以确保每个客户端一次仅处理 N 条消息。

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

那有意义吗?