NServiceBus命令处理程序中的生产者/使用者

问题描述 投票:5回答:2

因为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。处理此Action需要一段时间。问题是当1个客户端决定发送200个DoAnActions时,所有其他客户端必须等待2-3个小时才能处理所有这些消息(FIFO)。相反,我想根据客户端的顺序处理这些消息。

因此,即使客户端A仍然有200条消息需要处理,当客户端B发送消息时,它将接下来排队。如果客户端B发送3条消息,则队列将如下所示:B-A,B-A,B-A,A,A,A,......

c# .net nservicebus producer-consumer
2个回答
2
投票

很多时候,我发现这样做的真正原因来自商业角度。在这种情况下,在代码中对其进行建模以反映业务规则和规则是有意义的。

想象一下,您有一条SendEmail消息,但您希望根据其预期的客户“优先化”某些消息。您可以以不同的方式设计系统,以便有两种消息类型,一种是常规SendEmail,另一种是SendPriorityEmail,它们可以转到不同的端点/队列。您需要在代码中确定要发送哪条消息。

将根目录中的消息分开意味着您具有更大的灵活性(也来自业务),当涉及更重要的客户(在这种情况下)时,这些灵活性在执行监控,SLA和服务质量类型时非常有用。


0
投票

您可以使用Sagas来执行您要查找的内容,实际上每个客户端ID都有一个saga实例。该传奇充当“阻塞点”,并且可以确保每个客户端一次只处理N条消息。

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

那有意义吗?

© www.soinside.com 2019 - 2024. All rights reserved.