我有一个用C#编写的Windows服务,它从MSMQ读取,并根据消息的类型将它分配给在工作线程中处理该消息的代理。应用程序从没有代理开始,并在消息到达MSMQ时在运行时动态创建
以下是它如何运作的基本图:
如果代理工作线程忙于工作,则消息将排队到其本地队列。到现在为止还挺好。但是,如果由于某种原因停止服务,则本地队列内容将丢失。
我正在试图找出处理这种情况的最佳方法。现在本地队列是System.Concurrent.ConcurrentQueue
。我可能使用Sql Ce db或其他一些持久存储,但我担心性能。我想到的另一件事是只有当代理准备处理消息时才从MSMQ读取,但问题是我不知道MSMQ将包含什么消息。
我可以采取哪些方法来处理这个问题?
答案 0 :(得分:3)
您的设计基本上实现了以下模式:http://www.eaipatterns.com/MessageDispatcher.html
但是,您选择在多线程代码中实现调度程序,而不是使用实际的消息传递。
相反,每个处理代理应该是具有自己的物理消息队列的自治进程。这将在失败的情况下提供消息持久性。它还允许您通过托管处理代理的更多实例来进行扩展。
答案 1 :(得分:1)
我已经构建了一个依赖Redis的类似系统。我们的想法是提供与应用程序其余部分隔离的内存快速数据访问,并且在我的服务执行时不会关闭。此外,它最终将我的数据保存到磁盘,因此我在可靠性和速度之间得到了很好的折衷。
如果您设计它以便每个客户端从其自己的Redis托管的消息队列中读取,您可以使队列独立于服务的停机时间,并且在您下次启动服务时分配每个工作者的负载。
答案 2 :(得分:0)
为什么不简单地创建两个新的msms队列来接收Agenta和agentb的消息,并创建一个新的代理(事务性地)从主队列中获取命令并将消息分派给正确的代理队列? / p>