2

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

我认为 MSMQ 是要走的路,因为可能会有大量消息进入,您可以创建多个队列。

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

如果我将消息直接发送到 MSMQ,那么应用程序将与 MSMQ 紧密耦合,如果我以后想废弃 MSMQ 并使用其他东西,我会被搞砸的。我不想在每次警报摘要应用程序更改时对应用程序进行更改。

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

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

4

4 回答 4

3

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

于 2012-11-16T19:25:22.610 回答
1

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

它完全依赖于 WCF,使用 NetTcpBinding 并将所有信息保存在 Sql Server 数据库中。

主要的 WCF 服务负责将信息持久化到数据库中。其他 wcf 服务将数据返回给需要它的客户(挂在我们墙上的 32 英寸触摸屏、桌面小工具、智能手机)。

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

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

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

太棒了,IMO wcf 是实现您目标的绝佳技术!

于 2012-11-16T19:19:02.270 回答
1

不可能将自己完全与技术选择的后果隔离开来,并且在某些时候尝试这样做,您将获得递减的回报。

我知道我们都被教导要不惜一切代价避免耦合,就像它是某种疾病一样,但首先使用 WCF 的好处之一是您不会硬耦合到特定的传输。您可以仅通过配置更改将 MSMQ 换成 TCP。

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

通过 WCF 调用 MSMQ 的好处是它的代码量很少,并且可以很容易地被其他开发人员以几乎零分析开销的方式获取。我会胆怯地建议您可能正在过度设计一个实际上并不存在的问题的解决方案。

想想在 12 个月内新加入您项目的开发人员。你想建立一个系统,他们不会在前两个月学习它,然后才能提高工作效率。使用旨在在某种程度上解耦您的熟悉框架可能会在某种程度上实现这一目标。

于 2012-11-16T21:40:03.203 回答
0

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

于 2012-11-29T00:44:35.183 回答