【问题标题】:NServiceBus - How to use NSB to handle events from large population of devicesNServiceBus - 如何使用 NSB 处理来自大量设备的事件
【发布时间】:2014-08-14 21:33:28
【问题描述】:

对不起,如果这个问题有点幼稚

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

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

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

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

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

但这是使用 NSB 的正确方法吗?

是否有任何文章或文档可以说明这种类型的架构?

注意我们目前有一个使用持久 MSMQ 和“手动”路由解决方案的解决方案(实施不再合适 - 见下文) - 因此存在一些压力来“发展”该解决方案,而不是采用像 NSB 这样更好的解决方案

为什么不再合适? - 很多原因,但主要是实现按类型路由消息(目的是让不同的服务使用不同的类型) 但是我们也允许按“组”(设备的集合)进行路由,这就是目前使用的方式 - 但这是手动配置,现在我们有数千台设备和大量客户应用程序(100+)非常尴尬需要他们自己的设备“组”,但现在也想将他们的一些设备“共享”给其他客户应用程序 它是使用 MSMQ 编写的自定义代码(和 dotnet 1.0 - 这是我们的第一个 dot net 项目! - 所以它做得还不错) 但是当我们想要重写这个时,看看 NSB 是有意义的

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

【问题讨论】:

  • 您能否详细说明实施不再适用的原因?这将有助于定义方法。
  • 编辑原始帖子以扩展现有解决方案
  • 听起来您需要订阅级别的基于内容的路由。有一个IPublishMessages 接口,也许您可​​以提供一个自定义实现,根据内容删除订阅者。我不是 NServiceBus 专家,所以也许有人可以指出这样的解决方案是否可行/有用。
  • 我目前在想,如果我必须自己实现某种形式的基于内容到特定订阅者的路由,那么我可能会改用“点对点”消息传递——我看不出是什么在这种情况下,好处 pub/sub 会给我

标签: nservicebus


【解决方案1】:

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

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

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

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

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

在任何情况下,无论是否使用 NServiceBus,您都希望避免事务性/持久性消息传递以达到您所说的费率。我认为即使使用非持久消息,MSMQ 也不会为您提供足够高的扩展性 - RabbitMQ 可能是您更好的选择。

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

希望对您有所帮助。

【讨论】:

  • “在任何情况下,无论是否使用 NServiceBus,您都希望避免事务性/持久消息传递以达到您所说的费率”
  • “无论如何,无论是否使用 NServiceBus,您都希望避免使用事务性/持久消息传递来实现您所说的费率。”是的 - 我们已经意识到,凭借我们在 MSMQ 和持久消息传递方面的经验,我们正在考虑使用分布式存储将传入数据与消息传递分开存储感谢指向 COPS 的指针 - 我将离开并研究 - 它是正是我所追求的信息类型
【解决方案2】:

这听起来像是类 Pub/Sub 类型的场景。如果您开始向不同的消费者显示相似的数据,最好让消费者订阅所有消息并让消费者放弃它不关心的消息。配置留在消费者手中。

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

【讨论】:

  • 嗨,亚当,感谢您的回复后者的缺点是它会产生更多流量,但在您的情况下这可能不是问题。 不幸的是,我认为它会是我们期望每台设备每分钟发送一条消息,因此我们目前每分钟接收 100,000 多条消息,如果我们假设有 100 个订阅者,那么这将是一个很大的流量,我们的目标是能够扩展到100 万台设备
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多