优点& Brokered与非代理消息系统的缺点

时间:2016-09-16 10:54:12

标签: architecture message-queue

我试图设计一个实时监控&控制系统是模块化的,因此可以分配,扩展/重新配置用于不同的硬件和控制系统。网络

我很快得出结论我需要某种分布式企业邮件系统。但是有很多选择,每个选项都有优点和缺点,其中一些选项决定了不同的架构。我试图找出是否需要代理或无代理系统,是否需要某些系统的消息可靠性(例如RabbitMQ)或者像ZeroMQ这样的系统的轻量级高吞吐量,或者&#34 ;按顺序到达"卡夫卡的高吞吐量。

首先,这些架构是否有意义?

ZeroMQ类型" Brokerless"系统

enter image description here

注意:

可能有很多" A部分"每个" B部分"以及许多" B部分"加入" C部分"

优点:

  • 高吞吐量,低出租率
  • 轻松集成到组件中,轻量级部署(无需部署代理)。

缺点

  • 邮件无法保证投放。有些可能会掉线。这可能是橙色突出显示区域中的问题。它对GUI并不重要,但如果本地控制模块正在做决定,可能需要所有信息。 (考虑到这一点,只是最新的可能就足够了 - 没有必要用过时的数据做出决定)。同样,如果A和B之间的网络出现故障,则历史记录将具有不完整的历史记录。这有多重要呢?
  • 否"发现"。需要更多地管理组件之间的关系。

RabbitMQ类型经纪人系统:

enter image description here

优点:

  • 邮件保证送达。
  • 通过经纪人管理发现。

缺点

  • 慢得多,高延迟
  • 更多部署&维护(经纪人/ RabbitMQ需要在机器上安装,它不仅仅是内置于模块中)

中间选项:

我看过卡夫卡。它经纪行,所以发现得到了解决。然而,它似乎比RabbitMQ更轻量级,虽然它不能保证交付(因此更快/更低的延迟),但它确实维持秩序,RabbitMQ并没有这样做。它还可以缓冲消息 - 因此,如果存在网络问题,可以检索它们。

写完之后,我不确定保证交付的重要性。如果控制模块收到一条消息,如果它是"旧的"这没关系。如果历史学家有一个完整的历史,那将是伟大的 - 但它是否必不可少?

实现我自己的"消息缓冲区"可能是一个选项。在ZeroMQ中进行网络通信,以便在发生故障时存储消息。我拥有比RabbitMQ更多的控制权,并且可以在我需要它时通过更不可靠(通过网络)进行消息传递来实现它。

显然,权衡这些优点或缺点是我的工作。我的问题是:还有什么需要考虑吗?这两个选项的架构是否有意义?

我计划将大多数实现都放在C#中,而且我目前在消息传递系统方面没有经验。

3 个答案:

答案 0 :(得分:3)

可靠性可能意味着不同的东西。这link from zmq可能是我读过的最好的之一。但这里简要说明了硬件故障时的可靠性

Apache Kafka - 邮件传递保证可能意味着不同的事情。见Message Delivery Semantics。值得注意的是"Kafka's semantics are straight-forward. When publishing a message we have a notion of the message being "committed" to the log. Once a published message is committed it will not be lost as long as one broker that replicates the partition to which this message was written remains "alive". "

RabbitMQ 也提供了一些选项。阅读Clustering and HA。但我个人认为Apache Kafka本质上(按设计)是一个分布式,分区,复制的提交日志服务,因此可以更清晰的方式解决这个问题。

ZMQ 我对zmq知之甚少,无法做出明智的结论。但我认为zmq并没有尝试解决可靠性问题。相反,它是embeddable networking library,它为高性能,可扩展的集群应用程序提供了一个基础,以便通过消息相互交互。但是,据我所知,它并没有特别解决可靠地持久化消息的问题(作为经纪人)。 Apache Kafka似乎很好地填补了这个空白 - 性能很好,但提供了实现可靠性的选项。

结论:我认为可靠性不仅仅是经纪人的责任。相反,它是构成您的应用程序的所有部分的集体责任。可靠性,性能和可扩展性只能通过良好的设计和使用正确的技术来实现。

答案 1 :(得分:1)

真正不可能实时地保证消息传递。如果系统确实需要实时数据(例如股票交易算法),那么它会更在意获得具有最低延迟的最新价格,而不是高延迟交付保证。

我认为您应该查看系统并将其分解为以下组件:

  • 需要实时(实时控制,决策)
  • 需要可靠(历史数据库)

看着您的图表,我认为您对两个消息系统有很好的要求

  • zeromq用于实时控制部件
  • kafka用于保证交付的历史/数据库部分。

顺便说一句,使用几个冗余的zmq代理和某种形式的DNS可以很容易地解决zmq发现。

答案 2 :(得分:0)

您的建议“在ZeroMQ中实现您自己的消息缓冲区,以便在发生故障时存储消息的网络通信”似乎是一种可行的方法。你曾经追求过吗?我会对您这样做的经历感兴趣。

一种具有持久性,低延迟和高吞吐量的“打包”消息管道似乎是理想的。在ZMQ之上构建它可以减少处理开销,并减少管理/设置麻烦。