因为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,...
答案 0 :(得分:2)
通常,我发现这样做的真正原因是出于商业角度。在这种情况下,有必要在代码中对其进行建模以反映围绕业务的规则和规定。
假设您有一条SendEmail
消息,但您想根据目标客户“优先”处理某些消息。您可以对系统进行不同的设计,以便拥有两种消息类型,一种是常规SendEmail
,另一种是称为SendPriorityEmail
的消息,它们将到达不同的端点/队列。您需要在代码中确定要发送的消息。
从根本上分离消息意味着您具有更大的灵活性(这也来自业务),这对于进行监控,SLA和更重要的客户的服务质量(在这种情况下)很有用
答案 1 :(得分:0)
您可以使用Sagas来完成所需的工作,每个客户端ID基本上都有一个传奇实例。传奇充当“阻塞点”,并且可以确保每个客户端一次仅处理N条消息。
这可能会在较低负载水平下将吞吐量降低到最大容量以下,但可能会导致您试图实现更“公平”的分配。
这有意义吗?