我试图设计一个实时监控&控制系统是模块化的,因此可以分配,扩展/重新配置用于不同的硬件和控制系统。网络
我很快得出结论我需要某种分布式企业邮件系统。但是有很多选择,每个选项都有优点和缺点,其中一些选项决定了不同的架构。我试图找出是否需要代理或无代理系统,是否需要某些系统的消息可靠性(例如RabbitMQ)或者像ZeroMQ这样的系统的轻量级高吞吐量,或者&#34 ;按顺序到达"卡夫卡的高吞吐量。
首先,这些架构是否有意义?
ZeroMQ类型" Brokerless"系统
注意:
可能有很多" A部分"每个" B部分"以及许多" B部分"加入" C部分"
优点:
缺点
RabbitMQ类型经纪人系统:
优点:
缺点
中间选项:
我看过卡夫卡。它经纪行,所以发现得到了解决。然而,它似乎比RabbitMQ更轻量级,虽然它不能保证交付(因此更快/更低的延迟),但它确实维持秩序,RabbitMQ并没有这样做。它还可以缓冲消息 - 因此,如果存在网络问题,可以检索它们。
写完之后,我不确定保证交付的重要性。如果控制模块收到一条消息,如果它是"旧的"这没关系。如果历史学家有一个完整的历史,那将是伟大的 - 但它是否必不可少?
实现我自己的"消息缓冲区"可能是一个选项。在ZeroMQ中进行网络通信,以便在发生故障时存储消息。我拥有比RabbitMQ更多的控制权,并且可以在我需要它时通过更不可靠(通过网络)进行消息传递来实现它。
显然,权衡这些优点或缺点是我的工作。我的问题是:还有什么需要考虑吗?和这两个选项的架构是否有意义?
我计划将大多数实现都放在C#中,而且我目前在消息传递系统方面没有经验。
答案 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)
真正不可能实时地和保证消息传递。如果系统确实需要实时数据(例如股票交易算法),那么它会更在意获得具有最低延迟的最新价格,而不是高延迟交付保证。
我认为您应该查看系统并将其分解为以下组件:
看着您的图表,我认为您对两个消息系统有很好的要求
顺便说一句,使用几个冗余的zmq代理和某种形式的DNS可以很容易地解决zmq发现。
答案 2 :(得分:0)
您的建议“在ZeroMQ中实现您自己的消息缓冲区,以便在发生故障时存储消息的网络通信”似乎是一种可行的方法。你曾经追求过吗?我会对您这样做的经历感兴趣。
一种具有持久性,低延迟和高吞吐量的“打包”消息管道似乎是理想的。在ZMQ之上构建它可以减少处理开销,并减少管理/设置麻烦。