使用 MSMQ 队列分离消息生成者和使用者

本文关键字:使用者 消息 MSMQ 队列 分离 使用 | 更新日期: 2024-10-30 06:33:16

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

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

所以我想出了以下设计。最好的方法是什么?队列是否会在可扩展性、鲁棒性、解耦方面改进设计?在这种情况下使用队列是个好主意吗?

建议设计A:具有 1 到 N 个线程的服务。每个线程同步处理报告(获取报告、聚合、翻译、通过 SOAP 发送)

建议的设计B:具有以下功能的视窗服务:

  • 1 个 MSMQ 消息队列
  • 1 到 N 个生产者线程:(获取报告,聚合、通过 MSMQ 排队消息)
  • 1 到 N 个使用者线程:(通过 SOAP 进行出队列、翻译、分发)

建议的设计C:

  • 具有生产者线程的 Windows 服务(通过 WCF NetMsmqBinding Client 获取报告、聚合、将消息排队到专用 MSMQ 队列)
  • IIS/WAS 托管的启用 MSMQ 的服务(侦听 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

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