使用 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 有什么特别的原因吗?如果你使用你建议的设计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
显然,我对你情况的了解仅限于你在问题中发布的内容,所以我可能错过了一些重要的东西。