Oba*_*aid 6 c# concurrency windows-services msmq
我有一个用C#编写的Windows服务,它从MSMQ读取,并根据消息的类型将它分配给在工作线程中处理该消息的代理.应用程序从没有代理开始,并在消息到达MSMQ时在运行时动态创建
以下是它如何工作的基本图:

如果代理工作线程正在忙于工作,则消息将排队到其本地队列.到现在为止还挺好.但是,如果由于某种原因停止服务,则本地队列内容将丢失.
我想弄清楚什么是处理这种情况的最佳方法.现在本地队列是一个System.Concurrent.ConcurrentQueue.我可能使用Sql Ce db或其他一些持久存储,但我担心性能.我认为另一件事是只有当代理准备处理消息时才从MSMQ读取,但问题是我不知道MSMQ将包含什么消息.
我可以采取哪些方法来处理这个问题?
我已经构建了一个依赖Redis的类似系统。这个想法是,它提供与应用程序其余部分隔离的内存快速数据访问,并且当我的服务关闭时不会关闭。此外,它最终会将我的数据保存到磁盘上,因此我在可靠性和速度之间取得了良好的折衷。
如果您将其设计为每个客户端都从自己托管在 Redis 中的消息队列中读取数据,则可以使队列独立于服务的停机时间,并且在下次启动服务时分配每个工作线程的负载。