NServiceBus - 如何使用NSB处理来自大量设备的事件

时间:2014-08-14 21:33:29

标签: nservicebus

对不起,如果这个问题有点天真

我们有大量设备(> 100,000)将事件发送到我们的主机,我们希望不同的客户应用程序能够从特定设备接收事件

一个具体的例子是温度读数,一个客户应用程序可能需要来自地理区域内所有设备的读数,而另一个客户应用程序可能需要安装在特定设备(例如冷藏食品区域)中的所有设备的读数,但是地理区域 另一个客户应用程序只对他们制造的设备感兴趣 即这些将重叠'设置'设备

也许这只是“物联网”的一个例子。噪声比(IoT)?

我相信NSB中的pub / sub方法使用'消息类型'识别目的地订阅 - 但我怀疑这些消息都是相同的类型

我相信,假设我自己处理路由,我可以使用bus.send

但这是与NSB合作的正确方法吗?

是否有任何文章或文件说明了这种类型的架构?

N.B。我们目前有一个解决方案,使用持久的MSMQ手动滚动'路由解决方案(实施不再适用 - 见下文) - 因此有一些压力可以“发展”。该解决方案,而不是像NSB那样采用更好的解决方案

为什么它不再合适? - 很多原因,但主要是实现按类型路由消息(意图是让不同的服务使用不同的类型) 但我们也允许通过' group' (一系列设备),这就是它目前使用的方式 - 但它是一种手动配置,现在我们有成千上万的设备和需要的大量客户应用程序(100+),这很尴尬他们自己的小组'设备,但现在想分享'他们的一些设备也适用于其他客户应用程序 它是使用MSMQ编写的自定义代码(和dotnet 1.0 - 这是我们的第一个dot net项目! - 所以它没有做得太糟糕) 但是,由于我们正在寻求重新编写此内容,因此查看NSB是有意义的

我想部分问题在于我还没有找到一个'模式'这符合我们正在尝试做的事情 - 所以它更难解释它是什么 但是,鉴于“物联网”的出现, - 我希望这是一个比它真的更常见的问题吗?

2 个答案:

答案 0 :(得分:1)

之前构建过这类系统之后,您需要考虑的一件事是,用户正在查看的任何UI都无法快速刷新以反映真实世界发生变化的速度。

设计需要依赖于内存模型,该模型在处理现实世界变化时进行更新。从那里,最简单的解决方案是让UI线程轮询该模型,然后呈现当前状态。

如果用户希望能够更改他们在运行时使用的过滤器,则您需要让客户端仍然保留所有信息,以便您有足够的历史记录供用户查看。为清楚起见,这意味着客户端不会根据用户当前查看的内容过滤数据 - 它需要接收和处理所有内容。

按照您正在谈论的费率(1M + msgs / min = 15k msgs / s),您不会想要在每个客户端上处理它。相反,您需要某种通用操作图片服务器(COPS),它将聚合来自所有设备的数据。

如果您需要支持的客户数量不大,您可以让他们轮询COPS - 这将是最简单的。

在任何情况下,如果使用NServiceBus,您都希望避免使用事务性/持久性消息传递来实现您所谈论的费率。即使使用非持久消息,我也不认为MSMQ会为你扩展得足够高 - RabbitMQ对你来说可能是更好的选择。

如果您需要在更高级别的实体上执行任何类型的逻辑,这些实体的状态是由来自多个传感器的数据构建的,那么事情会变得更加复杂。我在一段时间后写了一篇关于此事的文章:http://msdn.microsoft.com/en-us/magazine/dd569749.aspx

希望有所帮助。

答案 1 :(得分:0)

这听起来像是一个类Pub / Sub类型的场景。如果您开始向不同的消费者展示类似的数据,那么让消费者订阅所有消息并让消费者放弃它不关心的消息会更好。配置与消费者保持一致。

使用NSB,您可以通过多种方式实现这一目标,或者使用不同的消息类型,让每个消费者只订阅它关心的消息,或者让每个消费者接收所有消息并仅处理它关心的消息。后者的缺点是它会产生更多的流量,但在您的情况下这可能不是问题。