【发布时间】:2016-08-19 21:50:00
【问题描述】:
我是设计系统的新手,对消息队列和协调服务(zookeeper)有一些疑问。
如果有人能澄清这些概念,那就太好了:-
我对正在设计的系统中的 MQ 的理解:-
我将拥有生产者服务,它将创建消息并添加到 MQ。消费者将使用此消息并执行适当的操作。一旦消费者 ACK 的消息处理完成; MQ 会将偏移量移动到下一个。我不希望我的消息被错过,所以我必须确保消息被成功使用。我也试图让这个系统只使用一次消息(尽可能接近)。
基于这种理解,现在我有以下问题:-
1)如果我希望我的生产者和消费者在同一个 DC 中运行多个实例(以实现高可用性),那么我是否需要将生产者和消费者都作为单独的 Zookeeper 服务?我所有不同的服务(在微服务世界中)是否需要单独的 zookeeper 服务器/实例或同一个实例可以解决这个问题?
2) 当消息被消费者消费时,它会在消费后确认 MQ(完成处理并采取任何需要的操作。)。我试图了解对于每秒将有数千个请求的系统来说,这将如何更快。如果我们阅读更多消息或不等待 ACK 直到处理,那么在消费者失败的情况下,这些消息将被遗漏,因为它们从未成功处理过。我知道拥有更多消费者会使它并行工作,但不清楚这个概念是如何工作的。有人可以向我解释一下什么是正确的消费和配置组件之间的交互方式,以使其优化、持久、高可用性、可靠并且接近一次模型。
编辑:我计划在系统中使用 Java、Zookeeper、Kafka、Cassandra。
【问题讨论】:
标签: apache-kafka apache-zookeeper microservices distributed-system