拥有Publisher和N个消费者,如果消费者使用 auto.offset.reset=latest
,那么他们会错过在订阅主题之前发布到主题的所有消息...已知的事实是,带有 auto.offset.reset=latest
的消费者不会重播该主题中存在的消息它订阅了......
所以我需要:
-
让发布商等到所有订阅者开始使用消息然后开始发布 . Dunno如何在不利用Zookeeper的情况下做到这一点 . Kafka 是否提供了这样做的手段?
-
另一种方法是拥有
auto.offset.reset=latest
消费者并让他们明确地使用所有现有消息,以防他们即将订阅带有现有消息的主题...
这种情况的最佳做法是什么?
我猜消费者必须检查现有消息的主题,如果有消息则消费它们,然后启动 auto.offset.reset=latest
消费 . 这听起来对我来说是最好的方式......
2 回答
我们使用Eureka提供的服务发现功能(任何其他服务发现应用程序将执行此操作)别名来执行选项(1) . 基本上,发布者不会注册自己(并开始处理请求或发布通知),直到至少有一个订阅者可用 .
如果高级别消费者开始使用,则会执行以下操作:
一个 . 如果找到有效的偏移量,则从那里恢复
湾如果未找到有效的偏移量,请根据
auto.offset.reset
设置偏移量因此,如果没有提交有效的偏移量,
auto.offset.reset
仅触发 . 此行为旨在并且必须在发生故障时提供至少一次处理保证 .因此,如果您想从头开始阅读主题,您可以使用新的使用者
group.id
并设置auto.offset.reset = earliest
,或者在启动poll()
循环之前使用seekToBeginning()
显式修改启动时的偏移量 .