对于将报告发布到SOAP服务的Windows服务(c#)的一些设计建议,我将不胜感激。
它从数据库中获取一组有限的报告(Oracle AQ表中的报告),将它们聚合到一条消息中,并将此消息转发给WCF SOAP服务。 如果已成功通过SOAP传输报告,则会将其标记为“已发送”。 否则,它们会再次添加到AQ表中(通过db作业)。
所以我提出了以下设计。 什么是最好的方式去? 队列在可扩展性,稳健性,解耦方面是否会改进设计? 在这种情况下使用排队是一个好主意吗?
拟议设计A: 使用1到N个线程进行服务。 每个线程同步处理报告(获取报告,聚合,翻译,通过SOAP发送)
拟议设计B: Windows服务:
提议的设计C:
答案 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
显然,我对你的情况的了解仅限于你在问题中发布的内容,所以我可能错过了一些重要的内容。