c# - 维护传出队列中消息的顺序 - .Net

标签 c# queue msmq sequence service-broker

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

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

最佳答案

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

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

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

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

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

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

关于c# - 维护传出队列中消息的顺序 - .Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575599/

相关文章:

powershell - 删除变量中最多第4个冒号的更快方法?

c# - XmlSerialize一个对象,可以是null、DbNull、int、bool。字符串或 double

c# - 如何使用 FileResult 下载文件?

c# - 您可以将应用程序添加到OpenFileDialog的位置栏中吗?

c++ - 在 C++ 中使用 vector 实现简单的优先级队列

queue - 如何在键值存储之上有效地建模队列?

php - 将 Redis 用于超时队列或排行榜

使用 MySQL 数据库的 C# 登录 - 无法在结果中找到指定的列

c# - 向 MSMQ 发送序列化数据时抛出 InvalidCastException

.net - MSMQ和轮询以接收消息?