Apache Kafka-AckMode最佳实践

Apache Kafka的ACK机制关乎消息可靠性。自动提交模式如RECORD、BATCH、TIME和COUNT在不同场景下各有优劣,可能导致消息丢失或重复。手动提交模式MANUAL和MANUAL_IMMEDIATE提供更高控制权,但需用户处理提交。最佳实践建议根据业务需求平衡消息安全与性能,考虑是否启用自动提交及选择合适的提交策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述


概述

Apache Kafka-消息丢失分析 及 ACK机制探究

在这里插入图片描述
我们这里配了个manual, 为啥子嘛


AckMode源码解读

我们来看下 Spring Kafka封装的ACK

ContainerProperties#AckMode

	/**
	 * The offset commit behavior enumeration.
	 */
	public enum AckMode {

		/**
		 * Commit after each record is processed by the listener.
		 */
		RECORD,

		/**
		 * Commit whatever has already been processed before the next poll.
		 */
		BATCH,

		/**
		 * Commit pending updates after
		 * {@link ContainerProperties#setAckTime(long) ackTime} has elapsed.
		 */
		TIME,

		/**
		 * Commit pending updates after
		 * {@link ContainerProperties#setAckCount(int) ackCount} has been
		 * exceeded.
		 */
		COUNT,

		/**
		 * Commit pending updates after
		 * {@link ContainerProperties#setAckCount(int) ackCount} has been
		 * exceeded or after {@link ContainerProperties#setAckTime(long)
		 * ackTime} has elapsed.
		 */
		COUNT_TIME,

		/**
		 * User takes responsibility for acks using an
		 * {@link AcknowledgingMessageListener}.
		 */
		MANUAL,

		/**
		 * User takes responsibility for acks using an
		 * {@link AcknowledgingMessageListener}. The consumer
		 * immediately processes the commit.
		 */
		MANUAL_IMMEDIATE,

	}

自动提交设置

  • RECORD

每条消息被消费完成后,自动提交

  • BATCH

每一次消息被消费完成后,在下次拉取消息之前,自动提交 (默认模式)

  • TIME :

达到一定时间间隔后,自动提交, 并不是一到就立马提交,如果此时正在消费某一条消息,需要等这条消息被消费完成,才能提交消费进度

  • COUNT

消费成功的消息数到达一定数量后,自动提交 ,它并不是一到就立马提交,如果此时正在消费某一条消息,需要等这条消息被消费完成,才能提交消费进度

  • COUNT_TIME

TIME 和 COUNT 的结合体,满足任一都会自动提交。


手工提交设置

  • MANUAL

调用时,先标记提交消费进度。等到当前消息被消费完成,然后在提交消费进度。

  • MANUAL_IMMEDIATE

调用时,立即提交消费进度。


最佳实践

那应该怎么配置呢

在这里插入图片描述

  • 配置 spring.kafka.consumer.enable-auto-commit为true, spring.kafka.consumer.auto-commit-interval 设置自动提交的频率 , 举个例子 自动提交,批量拉去了一波,还没消费完,你就提交了,这给时候如果消费者挂了,消息丢失。。。

  • 配置 spring.kafka.consumer.enable-auto-commit为false , spring.kafka.listener.ack-mode 设置具体模式,结合具体情况。 有可能重复消费,注意幂等性的判断

  • 另外,spring.kafka.listener.ack-time 和 spring.kafka.listener.ack-count 可以设置自动提交的时间间隔和消息条数

总而言之,没有标准答案,需要进行trade off ,权衡一下
在这里插入图片描述

嗨 ,你这不是诶说么。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值