【问题标题】:Maintain order of message in outgoing queue - .Net保持传出队列中消息的顺序 - .Net
【发布时间】:2012-01-24 10:12:43
【问题描述】:

在我的场景中,消息以预定义的顺序出现。一旦它进入我们的系统,多个接收者会从传入队列中提取消息并进行处理。一旦处理完成,处理后的消息应该按照它们到达的顺序发送出去。在扩大的系统中,我们如何确保这一点?

系统需要高处理速度和吞吐量。在 .net 世界中,哪个队列最适合这种情况?

【问题讨论】:

  • 显然您必须存储消息响应。立即在状态为“处理中”的传出队列中创建一个条目。将其更新为“完成”并在工作人员完成后存储响应。然后按顺序发送队列中的所有内容,直到您找到仍然处于“处理”状态的条目。
  • 哪个队列最适合这种情况?我已经更新了问题。
  • System.Collections.Generic.Queue,不是消息队列。
  • 系统需要高处理速度和吞吐量。如果我在一台机器上维护 Generic.Queue,那会不会成为单点故障?

标签: c# queue msmq sequence service-broker


【解决方案1】:

这是围绕订单交付的一个基本问题 - 在您系统的某个地方,您需要将所有内容限制为单个线程。这是不可避免的。

您选择在哪里执行此操作会对吞吐量产生很大影响。您可以选择将整个消息处理器设为单线程。这将确保维持秩序,但以低吞吐量为代价。

但是,您仍然可以同时处理消息,但是您需要以某种方式再次以正确的顺序组装它们。有一种称为 Resequencer - http://eaipatterns.com/Resequencer.html 的集成设计模式。

但是,如果您的消息中没有任何内容来指示排序,则重排序器模式依赖于您能够在进入系统的途中为每条消息加上时间戳或序列号。

此外,从队列传入的整个消息集是否需要按顺序传递?例如,可能只有您的一些消息需要按顺序传递。

或者,您可以将消息分组到相关标识符下的“集合”中 - 在每个集合中需要维护顺序,但您仍然可以在“每集合”的基础上进行并发处理。

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2017-06-19
    • 2011-04-09
    • 2023-04-05
    • 2011-05-01
    相关资源
    最近更新 更多