通过WCF服务发送消息来解耦MSMQ

时间:2012-11-16 18:56:32

标签: c# wcf architecture error-handling msmq

我有几个.Net应用程序(尚未构建)需要向数据库发送错误消息,警告,警报,心跳等,以便可以在警报汇总仪表板中查看它们。这不能减慢应用程序的速度。它必须快。我想要一种方法来确定某些消息的优先级,以便它们立即显示在仪表板中。

我认为MSMQ是要走的路,因为可能会有大量的消息进入,你可以排队几个。

让我的应用程序直接将消息发送到MSMQ会更快吗?或者,使用NetMSMQBinding将它们发送到WCF服务会更快吗?

如果我将消息直接发送到MSMQ,那么应用程序与MSMQ紧密耦合,如果我想稍后废弃MSMQ并使用其他东西,我将被搞砸。每当警报摘要应用程序发生变化时,我都不希望在应用程序处于激烈状态时对其进行更改。

如果我使用NetMSMQBinding将消息发送到WCF服务,那么我仍然将我的应用程序紧密地耦合到MSMQ,对吗?

此警报摘要应用程序可能非常庞大,影响整个系统中的每个应用程序,并且必须正确完成。

4 个答案:

答案 0 :(得分:3)

如果您希望避免与MSMQ的紧密耦合,我建议使用类似于本地总线抽象的内容来接收消息,然后以您希望的方式将其发送到MSMQ。这样,你总是可以插入一个不同的实现,使用你想要的任何东西(RabbitMQ,一些直接数据库持久性或你可能想到的任何东西)。 否则,我个人会尝试将消息处理尽可能地降低成本和尽可能短。您可能还想查看msmq performance such the this one上的文章。

答案 1 :(得分:1)

我刚刚为我工作的公司完成了一个与你类似的巨大项目。

它纯粹依赖于使用NetTcpBinding的WCF并在Sql Server数据库上保存所有信息。

主WCF服务负责将信息保存到数据库。其他wcf服务将数据返回给需要它的客户端(我们的墙上挂着一个32英寸的触摸屏,桌面小工具,智能手机)。

有一个公共库,其中包含合同定义以及此处所有应用程序使用的所有客户端相关内容(10+)。所有这些应用程序都针对wcf服务记录所有内容(始终在异步操作中):异常,警告,心跳甚至调试信息。这里的客户数量不是很大,大约60台同时运行1或2个应用程序。

仪表板是一个WPF应用程序,它继续联系wcf服务,以了解是否有基于优先级的更新,然后在一个漂亮的UI中显示它们。

在60多个客户之间我们有15个RTU,它们将来自3个不同城市的天然气管道的温度(ºC)和压力(条形)发送到同一台服务器,这些信息由Windows服务通过Tcp接收,然后发送到wcf服务(在同一台服务器上)。所有这些数据都很关键!!我们甚至还有另一个Windows服务,它不断查询wcf服务以查找重要事件,并向与该类事件相关的人员发送短信。

Soooooo,IMO wcf是实现目标的绝佳技术!

答案 2 :(得分:1)

不可能完全避免技术选择带来的后果,并且在某些时候尝试这样做会导致收益递减。

我知道我们都被教导要不惜一切代价避免耦合,比如它是某种疾病,但首先使用WCF的好处之一就是你没有与特定的传输很难耦合。您可以仅使用配置更改将MSMQ交换为TCP。

正如@nieve建议的那样,通过创建抽象,您确实将自己与实现细节脱钩,在本例中为WCF。但是,是否将自己与抽象总线表示结合起来更好?你可能会得到更少的“耦合”,但可以说是以更大的混淆为代价。

通过WCF调用MSMQ的好处是它只需少量代码,其他开发人员可以轻松获取,几乎没有分析开销。我会胆怯地建议你可能过度设计一个不存在的问题的解决方案。

考虑在12个月的时间内开始研究项目的开发人员。您希望构建一个系统,在这个系统中,他们不会花费前两个月学习,然后才能提高工作效率。使用熟悉的框架来设计可以在某种程度上解耦你可能会在某种程度上实现这一目标。

答案 3 :(得分:0)

在我的测试中,WCF和NetTcpBinding非常快(<1ms往返时间)。
通过使用async,可以在某些连接失败时避免锁定应用程序 AsyncWcfLib可以帮助提高抽象水平。