使用MSMQ队列来分离消息生产者和消费者?

时间:2013-12-18 22:37:19

标签: c# multithreading wcf queue msmq

对于将报告发布到SOAP服务的Windows服务(c#)的一些设计建议,我将不胜感激。

它从数据库中获取一组有限的报告(Oracle AQ表中的报告),将它们聚合到一条消息中,并将此消息转发给WCF SOAP服务。 如果已成功通过SOAP传输报告,则会将其标记为“已发送”。 否则,它们会再次添加到AQ表中(通过db作业)。

所以我提出了以下设计。 什么是最好的方式去? 队列在可扩展性,稳健性,解耦方面是否会改进设计? 在这种情况下使用排队是一个好主意吗?

拟议设计A: 使用1到N个线程进行服务。 每个线程同步处理报告(获取报告,聚合,翻译,通过SOAP发送)

拟议设计B: Windows服务:

  • 1 MSMQ消息队列
  • 1到N生产者主题:(获取报告, 聚合,通过MSMQ排队消息)
  • 1到N消费者主题: (通过SOAP出列,翻译,翻译)

提议的设计C:

  • 具有生产者线程的Windows服务(通过WCF NetMsmqBinding客户端获取报告,聚合,将消息排入私有MSMQ队列)
  • IIS / WAS托管启用了MSMQ的服务(通过SOAP侦听MSMQ队列,出列,转换,遍历)

1 个答案:

答案 0 :(得分:2)

您选择MSMQ有特殊原因吗?如果您使用提议的设计B,则可以使用BlockingCollection

我没有看到MSMQ在这种情况下提供了特别的优势,除非你想要多个进程,或者你希望将它传播到多台计算机上。

但你真的需要多个线程吗?这里的限制因素似乎是数据库访问时间或与WCF服务的通信。除非在您成功调用作业之前WCF服务必须进行一些主要处理。

所以你确定你不能只有:

while there are unsent jobs in the database
    get job
    send job to WCF
    if job sent successfully
        mark job as sent
end while

显然,我对你的情况的了解仅限于你在问题中发布的内容,所以我可能错过了一些重要的内容。