赞
踩
kafka 出现消息重复消费的原因:
解决方案:
那么这里会有个问题:什么时候提交 offset 合适?
在Kafka中,有三种常见的消息传递语义:At-least-once、At-most-once、Exactly-once。
其中At-least-once和Exactly-once是最常用的。
At-least-once消费语义意味着消费者至少消费一次消息,但可能会重复消费同一消息。在At-least-once语义中,当消费者从Kafka服务器读取消息时,消息的偏移量会被认己录下来。一旦消息被成功处理,消费者会将位移提交回Kafka服务器。如果消息处理失败,消费者不会提交立移。这意味着该消息将在下一次重试时再次被消费。
At-least-once语义通常用于实时数据处理或消费者不能容忍数据丢失的场景。
如果你可以容忍消息丢失,那这个就可以保证消息只消费一次,他的实现就是只要这个消费组消费了该条消息,就直接提交offset。
Exactly-once消费语义意味着每个消息仅被消费一次,且不会被重复消费。在Exactly-once语义中,Kafka保证消息只被处理一次,同时保持消息的顺序性。为了实现Exactly-once语义,Kafka引入了一个新的概念:事务。
事务是一系列的读写操作,这些操作要么全部成功,要么全部失败。在Kafka中,,产者和消费者都可以使用事务,以保证消息的Exactly-once语义。具体来说,消费者可以使用事务来保证消息的消费和位移提交是原子的,而生产者可以使用事务来保证消息的生产和位移提交是原子的。
在Kafka0.11版本之前,实现Exactly-once语义需要一些特殊的配置和设置。但是,在Kafka0.11版本之后,Kafka提供了原生的Exactly-once支持,使得实现Exactly-ondce变得更加简单和可靠。
总之,At-least-once消费语义保证了数据的可靠性,但可能会导致数据重复。而Exactly-once消费语义则解决了重复问题,但需要更复杂的设置和配置。选择哪种消费语义取决于业务需求和数据可靠性要求。
在 Kafka 如何保证消息不丢失这里,我们提到了 Kafka 的重试机制。由于这部分内容对于消息可靠性的优化较为重要。
消费过程在默认配置下,当消费异常会进行重试,重试多次后会跳过当前消息,继续进行后续消息的消费,不会一直卡在当前消息。因此,即使某个消息消费异常,Kafka 消费者仍然能够继续消费后续的消息,不会一直卡在当前消息,保证了业务的正常进行。
默认配置下,Kafka 消费者在默认配置下会进行最多 10 次 的重试,每次重试的时间间隔为 0,即立即进行重试。如果在 10 次重试后仍然无法成功消费消息,则不再进行重试,消息将被视为消费失败。
当达到最大重试次数后,数据会直接被跳过,继续向后进行。当代码修复后,如何重新消费这些重试失败的数据呢?
Kafka 本身并不直接支持死信队列(Dead Letter Queue,DLQ)。然而,可以通过一些方式来模拟实现类似死信队列的功能。可以通过自定义实现来达到类似的效果。一种常见的做法是创建一个或多个特定的主题来作为“死信主题”。当消息处理出现错误时,将这些消息发送到对应的“死信主题”中进行存储。
实现的方式大致如下:
另外,一些与 Kafka 相关的框架或组件可能提供了对死信队列的开箱即用支持。例如,Kafka Connect 中可以通过配置来实现一定程度上的死信队列功能。
虽然 Kafka 没有内置的死信队列概念,但通过上述自定义或借助相关框架的方式,仍然可以满足对死信队列的需求,实现对无法正常处理消息的特殊处理和管理。
需注意,具体的实现方式可能会因项目的具体需求和技术架构而有所不同。在实际应用中,需要根据情况选择最适合的方法来模拟死信队列的功能。同时,要确保对“死信主题”中的消息进行适当的监控和处理,以避免这些消息被无限期地忽略或积累。
消息堆积,一般都是因为消费者在消费过程中,由于消费耗时过长或消费并发度较小等原因,导致消费能力不足,出现消息堆积的问题。当线上出现消息堆积的问题时,一般有以下几种方式来解决:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。