-
初始化 GroupRebalanceConfig
参数 说明 默认值 建议配置值 session.timeout.ms 消费者心跳超时时间,超时则触发重平衡 10s 3 × heartbeat.interval.ms < session.timeout.ms heartbeat.interval.ms 心跳发送时间间隔 3s < session.timeout.ms max.poll.interval.ms 两次 poll 调用的最大间隔,超时则踢出消费组 5min 依据消息平均消费时间,避免消息消费完之前被踢出消费组 group.id 消费组ID ID名最好有业务意义 group.instance.id 配置此ID时,消费者成为消费组的静态成员,区别于未配置此ID的普通动态成员,静态成员相对于动态成员有更宽松的超时时间,即更不容易被踢出消费组 internal.leave.group.on.close 决定消费者调用close方法后是否离开消费者组,进而影响后续的Rebalance流程,当然如果close后不离开消费者组,在心跳超时后还是会被踢出 true -
读取client id 配置
参数 说明 默认值 建议配置值 client.id 消费者实例的唯一标识,也用于指标监控,如吞吐量按照client.id聚合,方便查看 命名可基于环境,业务标识模块等 -
读取
enable.auto.commit
配置,并检查group.id
配置项参数 说明 默认值 建议配置值 enable.auto.commit 控制消费者是否自动提交消费位移,若没有设置group.id,会抛出异常 InvalidConfigurationException true 最好是关闭,手动提交,否则在默认的5秒时间内消费者宕机,导致没有自动提交偏移量,会导致部分消息被重复消费 -
读取
request.timeout.ms
配置参数 说明 默认值 建议配置值 request.timeout.ms 定义客户端(Producer 或 Consumer)向 Broker 发送请求后,等待响应(如消息确认、数据拉取)的最大时长 30s -
读取
default.api.timeout.ms
配置参数 说明 默认值 建议配置值 default.api.timeout.ms 用于控制客户端发起元数据操作、管理类请求 (如创建主题、获取消费者组状态)的默认超时时,其他请求,如拉取消息等则是由 request.timeout.ms
来控制60s 参数 说明 默认值 建议配置值 retry.backoff.ms 控制发送请求失败后两次重试的等待间隔 100ms -
读取
key.deserializer
&value.deserializer
配置参数 说明 默认值 建议配置值 key.deserializer 消息key的反序列化器 参数 说明 默认值 建议配置值 value.deserializer 消息value的反序列化器 -
读取以下配置用于构造
SubscriptionState
对象参数 说明 默认值 建议配置值 auto.offset.reset 用于定义当无法获取有效消费位移(offset)时 的初始化策略。其行为受消费者组( group.id
)的偏移量提交状态影响。当为latest
时,表示消费最新的消息,为earliest
时表示从头开始消费,为none时,当无偏移量时直接抛出异常latest SubscriptionState简介:
SubscriptionState
是 Kafka 消费者本地化管理的核心枢纽,实现了:-
订阅模式隔离 → 确保
AUTO_TOPICS
、AUTO_PATTERN
、USER_ASSIGNED
互斥执行 -
offset生命周期管理 → 维护
position
(消费进度)与committed
(提交点)的协同 -
动态分区分配 → 支持消费者组重平衡时的状态同步
-
故障恢复机制 → 通过状态机和重置策略保障消费连续性
-
-
读取以下配置以构建
ConsumerMetadata
对象参数 说明 默认值 建议配置值 metadata.max.age.ms 强制刷新集群元数据的最大时间间隔 5min exclude.internal.topics 控制消费者在获取主题列表时是否包含 Kafka 内部主题(如 __consumer_offsets
)3s < session.timeout.ms allow.auto.create.topics 控制当生产者/消费者访问不存在的 Topic 时,是否自动创建该 Topic true ConsumerMetadata简介
用来维护以下关键集群信息:
- Broker节点拓扑
记录集群中所有 Broker 的
ID
、Host
、Port
,用于建立网络连接。
2. Topic与 Partition 映射存储订阅 Topic 的分区数量、副本分布(如分区 0 的 Leader 位于 Broker 1)。
3. 分区 Leader 信息每个 Partition 的当前 Leader 副本位置,消费者直接向 Leader 拉取消息
4. 消费组协调器(GroupCoordinator)记录负责管理当前消费组(
group.id
)的 Broker,用于提交位移和触发重平衡 -
读取以下配置以开始
ConsumerMetadata
的bootstrap
流程参数 说明 默认值 建议配置值 bootstrap.servers 初始连接的broker列表,客户端通过这些地址发现集群中的全部 Broker信息,以逗号分隔的 host:port 列表,例如:bootstrap.servers=broker1:9092,broker2:9092,broker3:9092 不用把所有的broker全部列出来,只需要能成功连接到一个broker, 便可以获取相关的元数据。但是至少配置两个 Broker:防止单个节点宕机导致连接失败 client.dns.lookup 控制如何解析 bootstrap.servers
中的主机名。可以配置为use_all_dns_ips
和resolve_canonical_bootstrap_servers_only
。后者先把CNAME解析为对应的规范名,再用该规范名解析单个IP,后续和use_all_dns_ips
流程一样use_all_dns_ips,尝试主机名的所有 DNS IP 地址(IPv4/IPv6),直到成功连接或全部失败 bootstrap
只是给ConsumerMetadata
构建了一个MetadataCache,里面包含了配置的broker节点(node)和一个cluster对象,在这里并没有去连接这些broker节点,只是设置了broker节点的节点ID(从-1开始,每有一个节点就递减1)和host/ip,port。扩展: CNAME 是 DNS(域名系统)中的一种记录类型,用于创建域名的别名 (Alias),将一个域名映射到另一个规范名称(Canonical Name)。它是实现域名重定向和抽象的核心 DNS 机制。
-
读取以下安全相关的配置以用于channel层数据传输
security.protocol
:安全协议选择该配置定义整体通信安全层级,是基础安全框架:
协议类型 认证方式 数据传输 适用场景 PLAINTEXT 无 明文 测试环境/内网安全环境 SSL 可选(证书) TLS加密 需要加密但不需要用户认证的环境 SASL_PLAINTEXT SASL认证 明文 不推荐(认证凭证明文传输) SASL_SSL SASL认证 TLS加密 生产环境标准配置 SASL_PLAINTEXT+SSL 混合 TLS加密 特殊协议兼容场景(如Kerberos) sasl.mechanism
:认证机制选择 当使用 SASL 协议时,指定具体的认证方式:认证机制 特点 配置复杂度 推荐度 PLAIN 用户名/密码认证 需配合SSL防止密码泄露 ★☆☆☆☆ 基础场景 SCRAM-SHA-256 盐值挑战响应机制 密码在服务端加盐存储 ★★★☆☆ ★★★★★ SCRAM-SHA-512 更强的SHA512哈希 安全性更高 ★★★★☆ ★★★★★ OAUTHBEARER OAuth 2.0令牌认证 适合云原生和微服务 ★★★★★ 云环境 GSSAPI Kerberos认证 需部署KDC服务器 ★★★★★ 企业内网 -
设置
isolationLevel
isolation.level
是 Kafka 消费者实现事务消息可靠消费的核心配置,决定了消费者能否读取未提交(in-flight)的事务消息。其设计目标是与生产者事务机制配合,提供类似数据库的 ACID 语义。在kafka中,有如下两种配置:
隔离级别 行为 适用场景 缺陷 read_uncommitted • 读取所有消息(包括未提交的事务消息) • 默认值 非事务处理 • 延迟敏感型应用 ⚠️ 可能读到"幽灵消息"(生产者失败导致未提交的消息) read_committed • 只读取已提交的事务消息 • 自动过滤生产者未提交的消息 • 通过事务元数据(__transaction_state)实现过滤 金融交易 数据一致性要求高的场景 🔒 引入额外延迟(等待事务提交) -
构建
apiVersions
对象ApiVersions
是 Kafka 协议中的能力协商机制,是客户端与 Broker 通信的第一个关键握手步骤,负责进行协议版本兼容性管理。 -
读取以下配置以构建
NetworkClient
对象配置项 默认值 作用 connections.max.idle.ms 9分钟 空闲连接自动关闭时间(防止云平台清理长连接) request.timeout.ms 30秒 请求超时阈值 socket.connection.setup.timeout.ms 10s 单次连接建立尝试的最大超时时间 socket.connection.setup.timeout.max.ms 30s 连接建立阶段(含重试)的总超时上限 reconnect.backoff.ms 50ms 重连初始退避时间 reconnect.backoff.max.ms 1000ms 重连最大退避时间 send.buffer.bytes 128KB Socket发送缓冲区 receive.buffer.bytes 64KB Socket接收缓冲区 NetworkClient
是 Kafka 客户端库(生产者/消费者)的核心网络通信引擎,负责所有底层网络操作,是高效传输的核心保障。
大致的通信流程:
-
基于
NetworkClient
构建ConsumerNetworkClient
对象- 专为消费者场景设计
- 封装NetworkClient提供消费语义
- 处理消费者特有任务(心跳、重平衡)
- 实现消费位移提交
- 提供阻塞式API适配poll循环
-
读取
partition.assignment.strategy
配置以设置分区分配策略内置的策略:
策略类型 工作原理 优势 劣势 适用场景 RangeAssignor (默认) 按主题分区范围分配: 消费者A:分区0-2 消费者B:分区3-5 • 实现简单 • 同主题分区连续 • 负载不均衡 • 消费者增减时分配不均 主题少、分区均衡的简单场景 RoundRobinAssignor 轮询分配所有分区: 分区0→A, 1→B, 2→A, 3→B... • 绝对均衡 • 分区分布均匀 • 消费者上下线引起全局重分配 • 暂停时间长 多主题、消费者数量固定的场景 StickyAssignor 初始轮询分配,重分配时: 1. 保持原分配 2. 仅调整新增/移除部分 • 最小化重分配 • 保留本地缓存 • 均衡度高 • 实现复杂 动态伸缩场景、有状态消费者 CooperativeStickyAssignor 增量重平衡: 1. 放弃小部分分区 2. 分阶段完成重平衡 • 零停机时间 • 重平衡期间可继续消费 • Kafka 2.4+ 支持 除了以上这四个内置的分配策略以外,用户还可以自定义分区策略。此外,策略可以配置多个,当需要重分区时,
leader consumer
会按照配置顺序尝试各个策略,直到找到所有消费者都支持的策略。 -
读取以下配置以构建
ConsumerCoordinator
对象参数 说明 默认值 建议配置值 各配置值说明 internal.throw.on.fetch.stable.offset.unsupported 当消费者设置 isolation.level=read_committed
时需获取事务型分区的 稳定偏移量 (即已提交事务的最大偏移),此时如果broker不支持,比如存在以下两种情况时:Broker 版本 < 0.11(不支持事务)或者Broker未启用事务功能(transaction.state.log.replication.factor=-1
)。true true: 抛出 UnsupportedVersionException
false: 返回错误码UNSUPPORTED_VERSION
client.rack 机架标识,优先与同机架的broker通信以降低网络延迟 auto.commit.interval.ms 控制自动提交的时间间隔,设置 enable.auto.commit
为true时,该配置生效5s -
构建
Fetcher
、OffsetFetcher
、TopicMetadataFetcher
对象-
Fetcher
角色:消费者拉取消息的核心引擎
职责:
- 从 Broker 的分区拉取实际的消息数据
- 管理网络请求的发送与响应处理
- 维护分区拉取偏移量(Offset)
-
OffsetFetcher
角色:偏移量管理专职工
职责:
- 获取分区提交偏移量(committed offset) → OffsetFetchRequest
- 查询分区时间戳偏移量 → ListOffsetsRequest(时间戳→offset映射)
-
TopicMetadataFetcher
角色:集群元数据侦探
职责:
-
获取 Topic 分区分布(MetadataRequest)
-
探测分区 Leader/ISR 变更
-
发现新分区(动态分区扩展场景)
-
路由更新(识别分区迁移)
-
-