kafka怎么确保消息不丢失?
生产者
生产者数据传输导致的数据丢失主常见情况是生产者发送消息给 Kafka ,由于网络等原因导致消息 丢失,对于这种情况也是通过在 producer 端设置 ack = all 来处理,这个参数是要求 leader 接收到 消息后,需要等到所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条 件,生产者会自动不断的重试。
消费者
消费者引起消息丢失的主要原因就是消息还未处理完 Kafka 会自动提交了 offset ,那么只要关闭自 动提交 offset ,消费者在处理完之后手动提交 offset ,就可以保证消息不会丢失。
Kafka
Kafka 导致的数据丢失一个常见的场景就是 Kafka 某个 broker 宕机,而这个节点正好是某个partition 的 leader 节点,这时需要重新重新选举该 partition 的 leader 。如果该 partition 的 leader 在宕机时刚好还有些数据没有同步到 follower ,此时 leader 挂了,在选举某个follower 成 leader 之后,就会丢失一部分数据。
解决方案:
- 配置参数,要求每个partition必须有至少2个副本;
- 配置参数,要求一个leader 至少感知到有至少一个 follower 还跟自己保持联系,没掉队,这样才能确保 leader 挂了还有一个follower 节点。
- 生产者配置ack= all, 这个是要求每条数据,必须是写入所有 replica 之后,才能认 为是写成功了;
- 在 producer端设置 retries=MAX (很大很大很大的一个值,无限次重试的意思):这个参数的 含义是一旦写入失败,就无限重试,卡在这里了。
Kafka如何保证消息的顺序性
kafka
把要保证有序性的message设置相同的key,那么这些message将会发送到同一个partition中,而且是有序的。
消费者
对于某个partition只能被一个消费者消费,如果这个消费者内部是单线程处理,可以保证有序性
如果是多线程处理,可以在消费者内部预置多个内存queue,具有相同key的数据放在同一个queue中,然后开启多线程,一个线程消费一个queue里面的message
Kafka为什么这么快
- 顺序读写
- 索引
- 批量读写和文件压缩
- 零拷贝
零拷贝
传统的IO模型
磁盘 -> fileCache -> 用户缓冲区 -> socket 缓冲区 -> 网卡
0拷贝
磁盘 -> fileCache -> 网卡