c# - MSMQ并发处理设计问题

标签 c# concurrency windows-services msmq

我有一个用 C# 编写的 Windows 服务,它从 MSMQ 读取并根据消息的类型将它们分配给在工作线程中处理该消息的代理。该应用程序在没有代理的情况下启动,并在消息到达 MSMQ 时在运行时动态创建

这是它如何工作的基本图:

enter image description here

如果代理工作线程正忙于工作,则消息将排队到其本地队列。到目前为止,一切都很好。但是如果由于某种原因服务停止了,本地队列的内容就会丢失。

我正在尝试找出处理这种情况的最佳方法。现在,本地队列是 System.Concurrent.ConcurrentQueue。我可能会使用 Sql Ce 数据库或其他一些持久存储,但我担心性能。我想到的另一件事是仅当代理准备好处理消息时才从 MSMQ 读取,但问题是我不知道 MSMQ 将包含什么消息。

我可以采取哪些可能的方法来解决这个问题?

最佳答案

您的设计基本上实现了以下模式:http://www.eaipatterns.com/MessageDispatcher.html

但是,您选择在多线程代码中实现调度程序,而不是使用实际的消息传递。

相反,每个处理代理应该是一个自治进程,具有自己的物理消息队列。这就是在发生故障时提供消息持久性的原因。它还允许您通过托管更多处理代理实例来简单地进行扩展。

关于c# - MSMQ并发处理设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535813/

相关文章:

java - 我想使用执行器线程池在我设计的 Web 应用程序中通过电子邮件发送运行时通知

c++ - Boost.Asio同步和并发数据结构模式

azure - 为 Windows 服务实现 Application Insights

c# - c#中字符串与百分比的模糊匹配

c# - VSIX:获取 DTE 对象

c# - 使用 OneDrive API 的正确方法是什么?

Java获取其他类的监视器锁

c# - 从 Form App c# 启动停止服务

c - Windows EXE 可以作为服务或应用程序运行。如何确定它是否作为服务运行?

c# - 从抽象类型列表中获取特定类型的所有项目