繁体   English   中英

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

[英]Use MSMQ queue to decouple message producer and consumer?

对于将报告发布到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队列,出列,转换,重写)

您选择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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM