基于.net音乐网站开发,新浪短网址链接生成器,织梦做中英文企业网站,潼南网站建设文章目录 Kafka1. Kafka如何保证不丢失消息#xff1f;生产者数据的不丢失消费者数据的不丢失Kafka集群中的broker的数据不丢失 2. Kafka中的消息是否会丢失和重复消费#xff1f;1. 消息发送2. 消息消费 3. Kafka 的设计是什么样的呢#xff1f;4. 数据传输的事务定义有哪三… 文章目录 Kafka1. Kafka如何保证不丢失消息生产者数据的不丢失消费者数据的不丢失Kafka集群中的broker的数据不丢失 2. Kafka中的消息是否会丢失和重复消费1. 消息发送2. 消息消费 3. Kafka 的设计是什么样的呢4. 数据传输的事务定义有哪三种5. Kafka 怎么判断一个节点存活6. 生产者是否直接将数据发送到 broker 的 leader (主节点)7. Kafka 消费者是否可以消费指定分区消息8. Kafka 消息是采用 Pull 模式还是 Push 模式9. Kafka 存储在硬盘上的消息格式是什么 存疑10. 介绍一下kafka 的 ack 机制11. Kafka 的消费者如何消费数据 Kafka
1. Kafka如何保证不丢失消息
生产者数据的不丢失
如果是同步模式
ack机制能够保证数据的不丢失如果ack设置为0风险很大一般不建议设置为0。即使设置为1也会随着leader宕机丢失数据。
producer.typesync
request.required.acks1如果是异步模式
也会考虑ack的状态除此之外异步模式下的有个buffer通过buffer来进行控制数据的发送有两个值来进行控制时间阈值与消息的数量阈值如果buffer满了数据还没有发送出去有个选项是配置是否立即清空buffer。可以设置为-1永久阻塞也就数据不再生产。异步模式下即使设置为-1。也可能因为程序员的不科学操作操作数据丢失比如kill -9但这是特别的例外情况。
producer.typeasync
request.required.acks1
queue.buffering.max.ms5000
queue.buffering.max.messages10000
queue.enqueue.timeout.ms -1
batch.num.messages200结论producer有丢数据的可能但是可以通过配置保证消息的不丢失。
消费者数据的不丢失
通过 offset commit 来保证数据的不丢失Kafka自己记录了每次消费的offset数值下次继续消费的时候会接着上次的offset进行消费。 而offset的信息在Kafka0.8版本之前保存在Zookeeper中在0.8版本之后保存到topic中即使消费者在运行过程中挂掉了再次启动的时候会找到offset的值找到之前消费消息的位置接着消费由于 offset的信息写入的时候并不是每条消息消费完成后都写入的所以这种情况有可能会造成重复消费但是不会丢失消息。 唯一例外的情况是我们在程序中给原本做不同功能的两个consumer组设置 Kafka SpoutConfig.bulider.setGroupid的时候设置成了一样的 groupid这种情况会导致这两个组共享同一份数据就会产生组A消费 partition1partition2 中的消息组B消费 partition3 的消息这样每个组消费的消息都会丢失都是不完整的。 为了保证每个组都独享一份消息数据groupid一定不要重复才行。
Kafka集群中的broker的数据不丢失
每个broker中的partition我们一般都会设置有replication副本的个数生产者写入的时候首先根据分发策略有partition按partition有key按key都没有轮询写入到leader中follower副本再跟leader同步数据这样有了备份也可以保证消息数据的不丢失。
2. Kafka中的消息是否会丢失和重复消费
要确定Kafka的消息是否丢失或重复从两个方面分析入手消息发送和消息消费。
1. 消息发送
Kafka消息发送有两种方式同步(sync)和异步(async)默认是同步方式可通过 producer.type属性进行配置。 Kafka通过配置 request.required.acks属性来确认消息的生产
0---表示不进行消息接收是否成功的确认
1---表示当Leader接收成功时确认
-1---表示Leader和Follower都接收成功时确认综上所述有6种消息生产的情况下面分情况来分析消息丢失的场景 (1) acks0不和 Kafka 集群进行消息接收确认则当网络异常、缓冲区满了等情况时消息可能丢失 (2) acks1、同步模式下只有Leader确认接收成功后但挂掉了副本没有同步数据可能丢失
2. 消息消费
Kafka 消息消费有两个 consumer 接口Low-level API 和 High-level API Low-level API消费者自己维护 offset 等值可以实现对 Kafka 的完全控制 High-level API封装了对 parition 和 offset 的管理使用简单 如果使用高级接口High-level API可能存在一个问题就是当消息消费者从集群中把消息取出来、并提交了新的消息offset值后还没来得及消费就挂掉了那么下次再消费时之前没消费成功的消息就“ 诡异”的消失了 解决办法 针对消息丢失 同步模式下确认机制设置为-1即让消息写入Leader和Follower之后再确认消息发送成功 异步模式下为防止缓冲区满可以在配置文件设置不限制阻塞超时时间当缓冲区满时让生产者一直处于阻塞状态 针对消息重复将消息的唯一标识保存到外部介质中每次消费时判断是否处理过即可。 消息重复消费及解决参考 如何保证消息不被重复消费如何保证消息消费时的幂等性-Java知音 消息的重复消费问题需要考虑幂等性如果消费类型天生幂等那么就没有必要去考虑重复消费的问题。 但是一般上 MQ 的任务都是一些比较耗时的任务比如说调用第三方服务此时可以采用第三方记录redis保存消息的唯一 id定义消息的唯一id 以及时间戳的消费类型待处理过程中失败/完成如果是消费过程丢失会导致消息长时间处于待处理的状态我们可以另起一个定时任务轮询一定时间间隔的任务将它生产到兜底服务由兜底服务去判断是否需要再次消费比如说一个 sms 服务可以去查询当前消息 id 的短信是否已经成功发出如果成功发出则标记当前任务成功消费。 3. Kafka 的设计是什么样的呢
Kafka 将消息以主题为单位进行归纳。
将向 Kafka 主题发布消息的程序称为生产者。将预订主题并消费消息的程序成为消费者。Kafka 以集群的方式运行可以由一个或多个服务组成每个服务叫做一个 broker中间人。生产者通过网络将消息发送到 Kafka 集群集群向消费者提供消息
4. 数据传输的事务定义有哪三种
最多一次: 消息不会被重复发送最多被传输一次但也有可能一次不传输最少一次: 消息不会被漏发送最少被传输一次但也有可能被重复传输精确的一次Exactly once: 不会漏传输也不会重复传输每个消息都传输被一次而且仅仅被传输一次这是大家所期望的。
5. Kafka 怎么判断一个节点存活
主要有两个条件
必须可以维护和 ZooKeeper 的连接ZooKeeper 通过心跳机制检查每个节点的连接如果节点是个 follower他必须能及时的同步 leader 的写操作延时不能太久。
6. 生产者是否直接将数据发送到 broker 的 leader (主节点)
生产者直接将数据发送到 broker 的 leader(主节点)不需要在多个节点进行分发为了 帮助 producer 做到这点所有的 Kafka 节点都可以及时的告知哪些节点是活动的目标 topic 目标分区的 leader 在哪。这样 producer 就可以直接将消息发送到目的地了。
7. Kafka 消费者是否可以消费指定分区消息
Kafka 消费消息时向 broker 发出 “fetch” 请求去消费特定分区的消息同时consumer 还指定消息在日志中的偏移量offset这样就可以消费从这个位置开始的消息。 消费者拥有 了 offset 的控制权可以向后回滚去重新消费之前的消息这是很有意义的。
8. Kafka 消息是采用 Pull 模式还是 Push 模式
Kafka 遵循了一种大部分消息系统共同的传统 的设计producer 将消息推送到 brokerconsumer 从 broker 拉取消息 。
9. Kafka 存储在硬盘上的消息格式是什么 存疑
消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32 校验码。
版本号: 1 byteCRC 校验码: 4 bytes具体的消息: n bytes
10. 介绍一下kafka 的 ack 机制
在Kafka发送数据的时候每次发送消息都会有一个确认反馈机制确保消息正常被收到。 可以通过设置request.required.acks 决定 ack 策略。 0: 生产者不会等待 broker 的 ack这个延迟最低但是存储的保证最弱。当 server 挂掉的时候就会丢数据1服务端会等待 ack 值。leader 副本确认接收到消息后发送 ack 。如果 leader 挂掉后不确保是否复制完成也就是说新 leader 可能会丢失数据-1同样在 1 的基础上服务端会等所有的 follower 的副本收到数据后 leader 才会发出 的 ack这样数据就不会丢失。 11. Kafka 的消费者如何消费数据
消费者每次消费数据的时候都会记录消费的物理偏移量offset 等到下次消费时他会接着上次位置继续消费 。