第四章 Kafka高级API——Acks&Retries&幂等写

Kafka生产者在发送完一个的消息之后,要求Broker在规定的额时间Ack应答答,如果没有在规定时间内应答, Kafka生产者会尝试n次重新发送消息。
acks=1默认

  • acks=1 Leader会将Record写到其本地日志中,但会在不等待所有Follower的完全确认的情况下做出响应。在这种情况下,如果Leader在确认记录后立即失败,但在Follower复制记录之前失败,则记录将丢失。
  • acks=0 生产者根本不会等待服务器的任何确认。该记录将立即添加到套接字缓冲区中并视为已发送。在这种情况下,不能保证服务器已收到记录,
  • acks=all 这意味着Leader将等待全套同步副本确认记录。这保证了只要至少一个同步副本仍处于活动状态,记录就不会丢失。这是最有力的保证。这等效于acks =-1设置.

如果生产者在规定的时间内,并没有得到Kafka的Leader的Ack应答, Kafka可以开启reties机制request.timeout.ms = 30000默认
retries = 2147483647默认

在这里插入图片描述
可能产生数据重复

幂等写

HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
Kafka在0.11.0.0版本支持增加了对幂等的支持。幂等是针对生产者角度的特性。幂等可以保证上生产者发送的消息,不会丢失,而且不会重复。实现幂等的关键点就是服务端可以区分请求是否重复,过滤掉重复的请求。要区分请求是否重复的有两点:
唯一标识:要想区分请求是否重复,请求中就得有唯一标识。例如支付请求中,订单号就是唯一标识
记录下已处理过的请求标识:光有唯一标识还不够,还需要记录下那些请求是已经处理过的,这样当收到新的请求时,用新请求中的标识和处理记录进行比较,如果处理记录中有相同的标识,说明是重复记录,拒绝掉。

不会丢失 retries
不会重复 去重

幂等又称为exactly once。要停止多次处理消息,必须仅将其持久化到Kafka Topic中仅仅一次。在初始化期间,kafka会给生产者生成一个唯一的ID称为Producer ID或PID。PID和序列号与消息捆绑在一起,然后发送给Broker。由于序列号从零开始并且单调递增,因此,仅当消息的序列号比该PID /TopicPartition对中最后提交的消息正好大1时,Broker才会接受该消息。如果不是这种情况,则Broker认定是生产者重新发送该消息。
enable.idempotence= false默认
注意:在使用幂等性的时候,要求必须开启retries=true和acks=all
在这里插入图片描述

<think>首先,用户的问题是:“kafka.producer.one.retrieskafka.producer.one.acks这两个参数干嘛的”,我需要用中文回答。问题涉及两个Kafka生产者参数:retries和acks。 回顾之前的对话: - 第一次回答是关于Kafka生产者最大重试次数(retries)的设置。 - 第二次回答是关于使用配置中心(如Spring Cloud Config)来配置Kafka参数。 现在,用户具体询问两个参数:kafka.producer.one.retrieskafka.producer.one.acks。这里的“one”可能是一个自定义前缀,表示特定生产者的配置,比如在配置文件中使用的命名空间。 关键参数解释: - **retries**: 这是生产者在消息发送失败时的重试次数。我之前解释过:默认值近乎无限,推荐设置如5次,关联重试间隔等。 - **acks**: 这是生产者要求broker确认消息入的机制。acks参数控制消息的持久性级别: - acks=0: 生产者不等待任何确认(最低持久性)。 - acks=1: 生产者等待leader入确认(默认值)。 - acks=all: 生产者等待所有in-sync副本(ISR)入确认(最高持久性)。 在配置中,kafka.producer.one.retrieskafka.producer.one.acks可能是在配置文件中定义的,例如在YAML中: ```yaml kafka: producer: one: retries: 5 acks: all ``` 这表示名为“one”的生产者配置。 我的回答结构: 1. 用中文解释这两个参数的功能。 2. 提供清晰的描述,包括默认值、选项和影响。 3. 由于是技术问题,可以添加代码示例或配置片段。 4. 最后,根据规则,必须提出3-5个相关问题,以“§§相关问题§§”开头。 回答内容大纲: - **retries**: 解释重试机制,重试次数如何影响可靠性,但可能导致重复。 - **acks**: 解释不同值的含义,如何影响消息持久性和性能。 相关问题:基于用户的问题和我的回答,提出3-5个相关问题。用户的问题是询问参数作用,所以相关问题可以涉及: 1. 参数如何配置。 2. 参数之间的交互(如retries和acks)。 3. 最佳实践。 4. 错误处理场景。 5. 与之前讨论的配置中心结合。 确保相关问题数量在3-5个,并以“§§相关问题§§”开头,一行输出。 完整回答格式: - 先回答问题。 - 然后输出“§§相关问题§§”后紧跟问题列表,用数字点分隔,不换行分散。 最终回答草稿: ### 回答 参数 `kafka.producer.one.retries` 和 `kafka.producer.one.acks` 是 Kafka 生产者的配置参数,其中 `one` 可能表示特定生产者实例的命名前缀。以下是详细解释: 1. **retries**: - **作用**:设置生产者在消息发送失败时的最大重试次数。当网络故障或 broker 暂时不可用时,生产者会自动重试发送。 - **默认值**:`Integer.MAX_VALUE`(近乎无限重试)。 - **影响**: - 增加重试次数可提高消息可靠性,但可能导致消息重复(需配合等性)。 - 需结合 `retry.backoff.ms`(重试间隔)和 `delivery.timeout.ms`(总超时)使用。 2. **acks**: - **作用**:定义生产者要求 broker 返回的消息确认级别,控制消息持久性。 - **可选值**: - `acks=0`:生产者不等待确认,消息可能丢失。 - `acks=1`:等待 leader 入确认(默认),平衡可靠性和性能。 - `acks=all`:等待所有 in-sync 副本(ISR)入,最高可靠性。 - **影响**: - 值越高,消息越可靠,但延迟增加。 - `acks=all` 需配合 `min.insync.replicas` 参数使用。 **配置示例**(YAML): ```yaml kafka: producer: one: retries: 3 acks: "all" ``` **参数协同**: - 高 `acks` + 高 `retries`:确保消息不丢失,但可能重复(需等性)。 - 低 `acks` + 低 `retries`:高性能,低可靠性。 §§相关问题§§ 1. 如何配置 Kafka 生产者的等性(idempotence)来避免消息重复? 2. `acks=all` 时,`min.insync.replicas` 参数的作用是什么? 3. 在配置中心中,如何动态调整不同环境(如测试和生产)的 `retries` 和 `acks` 参数? 4. Kafka 生产者重试机制在哪些故障场景下会失效? 5. 如何监控 `acks` 配置对消息延迟的影响?</think>### Kafka 生产者参数详解 参数 `kafka.producer.one.retries` 和 `kafka.producer.one.acks` 是 Kafka 生产者的核心配置(其中 `one` 为自定义前缀,通常用于区分不同生产者实例)。它们的作用如下: 1. **`retries`** - **作用**:定义生产者发送消息失败时的最大重试次数。 - **工作机制**: - 当网络抖动、Broker 短暂不可用或消息超时时触发重试。 - 重试间隔由 `retry.backoff.ms` 控制(默认 100ms)。 - **默认值**:`Integer.MAX_VALUE`(近乎无限重试)。 - **影响**: - 高值增强可靠性,但可能导致消息重复(需配合等性)。 - 需满足 `delivery.timeout.ms > (retries × retry.backoff.ms)`。 2. **`acks`** - **作用**:控制 Broker 对消息入的确认机制,决定消息持久性级别。 - **可选值及含义**: | 值 | 含义 | 可靠性 | 性能 | |----------|----------------------------------------------------------------------|--------|-------| | `acks=0` | 生产者不等待确认,消息可能丢失 | 最低 | 最高 | | `acks=1` | 等待 Leader 副本入确认(默认值) | 中等 | 中等 | | `acks=all`| 等待所有 In-Sync Replicas(ISR)入确认,需配合 `min.insync.replicas` | 最高 | 最低 | - **影响**: - 高可靠性场景(如金融交易)需设为 `all`,但会增加延迟。 **协同工作示例**: ```yaml # 在配置中心(如 Nacos)的 YAML 配置 kafka: producer: one: retries: 5 # 最大重试 5 次 acks: "all" # 最高可靠性确认 retry.backoff.ms: 200 min.insync.replicas: 2 # 需至少 2 个副本入 ``` **关键场景**: - 若 `acks=all` 且 `retries=0`:单次失败即丢弃消息,可靠性低。 - 若 `acks=all` 且 `retries>0`:确保消息不丢失,但需等性防重复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值