繁体   English   中英

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

[英]Decoupling MSMQ By Sending Messages Through a WCF service

我有几个.Net应用程序(尚未构建),需要将错误消息,警告,警报,心跳等发送到数据库,以便可以在警报摘要仪表板中查看它们。 这不会使应用程序减慢太多。 它必须快。 我想要一种优先处理某些消息的方法,以便它们立即显示在仪表板中。

我认为MSMQ是可行的方法,因为可能会有大量消息传入,您可以创建多个队列。

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

如果我直接将消息发送给MSMQ,则应用程序与MSMQ紧密相连,如果我以后要取消MSMQ并使用其他功能,我将被搞砸。 我不想在每次警报摘要应用程序更改时对应用程序进行疯狂更改后就对其进行更改。

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

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

如果您希望避免与MSMQ紧密耦合,建议您使用本地总线抽象之类的方法来接收消息,然后以您希望的任何方式将其发送给MSMQ。 这样,您始终可以插入使用您想要的任何东西(RabbitMQ,一些直接的数据库持久性或您可能想到的任何东西)的不同实现。 否则,我个人将尽量减少消息处理的成本,并使其尽可能短。 您可能还想看看有关msmq性能的文章, 例如this

我正在为我工​​作的公司完成一个与您相似的大型项目。

它完全依靠使用NetTcpBinding的WCF并将所有信息持久存储在Sql Server数据库中。

WCF主要服务负责将信息持久保存到数据库中。 其他wcf服务将数据返回给需要它的客户端(挂在墙上的32英寸触摸屏,台式机配件,智能手机)。

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

仪表板是一个WPF应用程序,它不断与wcf服务联系,以根据优先级知道是否有更新,然后将其显示在漂亮的UI中。

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

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

不可能使自己与技术选择的后果完全隔离开来,并且在某个时候尝试这样做会导致收益递减。

我知道我们都被教导要不惜一切代价避免耦合,例如某种疾病,但是首先使用WCF的好处之一是您不会硬性耦合到特定的传输方式。 您只能通过配置更改将MSMQ换成TCP。

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

通过WCF调用MSMQ的好处在于,它只需少量的代码,并且其他开发人员可以很容易地获得分析开销几乎为零的代码。 我会胆怯地建议您也许正在过度设计解决一个不存在的问题的解决方案。

考虑一下在12个月内将新手引入您的项目的开发人员。 您想建立一个系统,使他们在开始工作之前就不用花两个月的时间来学习它。 使用设计用于在某种程度上使您脱钩的熟悉的框架可能会达到某种目的。

在我的测试中,WCF和NetTcpBinding相当快(往返时间不到1毫秒)。
通过使用异步,可以避免在某些连接失败时锁定应用程序。
AsyncWcfLib可以帮助提高抽象级别。

暂无
暂无

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

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