深入解析Kafka消息传递的可靠性保证机制

深入解析 Kafka 消息传递的可靠性保证机制

Apache Kafka 是是一个高吞吐、分布式的消息队列系统,被广泛用于日志收集、实时流处理和事件驱动架构等场景。在分布式系统中,可靠性是消息系统的核心保障之一。Kafka 提供了三种级别的消息传递语义:

  • At most once(至多一次):可能丢失,不重复
  • At least once(至少一次):不丢失,可能重复
  • Exactly once(精确一次):不丢失,不重复

本文将全面讲解 Kafka 如何实现这三种语义,并详解相关配置项、机制原理及示例代码。


一、At Most Once(至多一次)

✅ 定义:

消费者先提交偏移量,再处理消息。若处理失败,消息不会再次消费,导致丢失。

✅ 实现原理:

消费者在处理消息之前就提交了偏移量(offset),若处理过程中发生异常或崩溃,消息将被视为已处理,不会再次消费

✅ 使用场景:

适用于对数据丢失不敏感的场景,如系统监控或日志采样等。

📌 配置方式:

配置项 默认值 含义
enable.auto.commit true true 启用自动提交 offset
auto.commit.interval.ms 1000 5000 每隔多少毫秒自动提交 offset
enable.auto.commit=true
auto.commit.interval.ms=1000

⚠️ 注意:

  • Kafka 自动提交 offset 是非阻塞的后台线程,并不保证在消息处理前或后执行。
  • 若消息处理失败,已提交 offset 无法回滚,消息会丢失。

二、At Least Once(至少一次)

✅ 定义:

先处理消息,再手动提交 offset。如果应用在提交前崩溃,Kafka 会重新投递该消息,保证消息不丢。

✅ 实现原理:

消费者在消息处理完成后手动提交 offset。若在提交 offset 前应用崩溃,Kafka 会再次发送未提交的消息。

✅ 使用场景:

适用于不能容忍消息丢失,但能容忍重复处理的场景,如订单系统、通知推送等。

📌 配置说明:

配置项 默认值 含义
enable.auto.commit false true 禁用自动提交 offset,转为手动提交
auto.offset.reset earliest / latest / none latest 指定当没有初始 offset 时如何处理(见下)
enable.auto.commit=false
auto.offset.reset=earliest

🎯 auto.offset.reset 说明:

含义
latest 默认值,从最新消息开始消费(新消费者看不到旧消息)
earliest 从最早的 offset 开始消费(适合新消费者回溯处理)
none 若没有 offset,则抛出异常(更严格)

✅ 示例代码(含详细注释):

import org.apache.kafka.clients.consumer.*;
import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

public class AtLeastOnceConsumer {
   
   
    public static void main(String[] args) {
   
   
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092"); // Kafka 服务地址
        props.put("group.id", "reliable-group");          // 消费组 ID
        props.put("enable.auto.commit", "false");         // 禁用自动提交
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微笑听雨。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值