gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:36:00 27 4
gpt4 key购买 nike

因为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, ...

最佳答案

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

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

在根部分离消息意味着您拥有更大的灵 active (这也来自业务),这在涉及更重要的客户(在本例中)时进行监控、SLA 和服务质量类型的事情时很有用.

关于c# - NServiceBus 命令处理程序中的生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com