我有几个相同服务的实例订阅了Kafka主题。生产者向主题发布1条消息。我希望所有实例都使用此消息。启动实例时,应从主题/分区的末尾读取消息。我不希望实例接收在服务启动之前发布的消息(但是,如果服务处理了一些旧消息,这些将不是一个大问题)。如果实例与Kafka断开连接一段时间或Kafka宕机,我不希望实例丢失消息,这意味着我需要定期提交偏移量。邮件可以处理两次,这不是什么大问题。
以下是归档所描述行为的最佳方法:每次启动实例时,为每个实例使用新的Guid或时间戳生成新的Kafka组ID?
上面第1条所述方法的缺点是什么?
答案 0 :(得分:1)
做两件事就足够了。首先,服务的每个实例都应具有自己的group.id
。这样可以保证每个人都能阅读所有已发布的消息,并在重新连接后会收到已发布的消息。该ID是每个实例的,不需要在启动时重新生成。其次,每个实例应具有属性auto.offset.reset=latest
,这也是默认属性。这样可以确保使用者不会读取在实例首次启动之前发布的消息。
当然,您的实例需要在处理完消息后提交偏移量。