【发布时间】:2016-02-04 23:46:47
【问题描述】:
Kafka 表示偏移量由消费者管理,同一组的消费者数量应该与分区数量一样多。
Spring集成说高级消费者中消费者流的数量是同一组的分区数。
那么,spring kafka 消费者代码可以运行在同一组的多台服务器上吗?如果是,如何知道偏移量不会在服务器之间发生冲突?
【问题讨论】:
-
一组有多个消费者?
标签: spring-integration apache-kafka
Kafka 表示偏移量由消费者管理,同一组的消费者数量应该与分区数量一样多。
Spring集成说高级消费者中消费者流的数量是同一组的分区数。
那么,spring kafka 消费者代码可以运行在同一组的多台服务器上吗?如果是,如何知道偏移量不会在服务器之间发生冲突?
【问题讨论】:
标签: spring-integration apache-kafka
根据 kafka 文档,如果实现了 group (http://kafka.apache.org/documentation.html#introduction),则每条消息仅由组中的一个消费者消费。每个消费者可以在一台机器上运行。两个消费者也可以在同一台机器上运行。在这种情况下,每个消费者可以是一个进程。
一个组可以包含多个消费者。分区可以通过一些算法分布在一组中的所有消费者之间。消费者的数量可以大于或小于分区的数量。
偏移量可以通过 zookeeper 的帮助来管理。但到目前为止,并非所有功能都已在某些客户端中实现。
至于您的用例,事实上,kafka 可能是“至少一次交付系统”。 Kafka 可以通过禁用生产者重试或在处理一批消息之前提交其偏移量来实现最多一次交付。实行“一次送达制”难度很大,需要合作。但是kafka提供了offset。所以有可能。更多详情请看http://kafka.apache.org/documentation.html#semantics、http://ben.kirw.in/2014/11/28/kafka-patterns/、https://dzone.com/articles/kafka-clients-at-most-once-at-least-once-exactly-o等。
根据我的个人经验,我花了很多时间来确保我的 kafka 系统是完全一次性交付系统。但是当服务器宕机时,一些消息可以被消费两次。但是我的测试是在独立的 kafka 服务器上完成的,在生产中总是使用 kafka cluter。所以,我认为它可以被认为是exactly-once系统。
【讨论】: