6

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

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

在此处输入图像描述

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

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

在这个问题上我可以采取哪些可能的方法?

4

3 回答 3

3

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

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

相反,每个处理代理应该是一个具有自己的物理消息队列的自治进程。这将在失败的情况下提供消息持久性。它还允许您通过托管更多处理代理实例来进行扩展。

于 2012-07-18T07:18:30.460 回答
1

我已经建立了一个类似的依赖于 Redis 的系统。这个想法是它提供了内存 - 与应用程序的其余部分隔离的快速数据访问,并且不会在我的服务关闭时关闭。此外,它最终会将我的数据保存到磁盘上,因此我在可靠性和速度之间取得了很好的折衷。

如果您将其设计为每个客户端都从其自己的将托管在 Redis 中的消息队列中读取,那么您可以使队列独立于服务的停机时间,并且在您下次启动服务时分配每个工作人员的负载。

于 2012-07-18T07:12:17.610 回答
0

为什么不简单地创建两个新的 msms 队列来接收 Agenta 和 agentb 的消息,并创建一个新的代理(以事务方式)从主队列中获取命令并将消息分派到正确的代理队列?

于 2012-07-18T07:17:59.830 回答