传说中 Kafka 的 0 消息丢失配置是怎么回事

标签: 传说 kafka 消息 | 发表时间:2021-11-16 15:25 | 作者:Pseudocode
出处:https://juejin.cn/backend

这是我参与11月更文挑战的第16天,活动详情查看: 2021最后一次更文挑战

本文讨论 Kafka 的 0 消息丢失配置的实现。

确立问题边界

之所以要先确立问题的边界,是因为,任何事都不是 100% 绝对的,要达到 0 消息丢失一定需要先确立前提。要保证 Kafka 消息不丢失的前提有两个:

  1. 消息必须是已经被提交的。已提交的意思是说,消息被生产者发送给 Broker,Broker 成功保存消息并告诉生产者消息已被成功提交。我们可以通过配置参数决定集群中有几个 Broker 成功保存消息后算成功提交。
  2. 集群中必须有至少一个 Broker 是存活的。这一点容易理解,如果 Kafka 集群整体都不可用了,比如所有的机房都停电了,那一定是不可能保证消息不丢失的。

消息如何丢失

要达到消息不丢失的结果,我们先要知道消息是如何丢失的,可以从生产者、Broker、消费者三方面分析。

生产者

Kafka producer 有一个发送消息的方法是 producer.send(msg),这个方法是异步处理消息的,也就是,当这个方法调用成功的时候,只是消息发出去了,而并不代表着发送成功了,或者消息被成功提交了。如果出现了网络不可用、消息本身不合格等原因导致消息根本没有被 Broker 接收,那就相当于消息在生产者端就消失了。

因此,建议在生产者端发送消息的时候,使用 producer.send(msg, callback) 带有回调的方法,这样我们就知道消息发送是成功了还是失败了,消息失败后,可以做针对性的处理。

对于发送失败的情况造成的消息丢失,责任在生产者一方,应该由生产者做相应的处理。

Broker

Broker 端的消息丢失,一般是由 Broker 服务不可用造成的,如果 Broker 都宕机了导致消息丢失,那么 Kafka 不会认为这属于已经提交的消息,因此这在我们讨论问题的边界之外。

消费者

最后一种就是消费者端造成的消息丢失。

消费者在消费消息的过程中,会同时更新消费者位移,也就是「已经消费到哪一条消息了」。这里就存在一个问题,当消费一个消息的时候,是先处理消息,成功后再更新位移,还是先更新位移,再处理消息。

如果先更新位移,在处理消息,当消息处理出现问题,或者更新完位移、消息还未处理,消费者出现宕机等问题的时候,消息就会丢失。

而如果先处理消息再更新位移,虽然可能会出现重复消费同一个消息的问题,但是,我们可以通过消费者处理逻辑实现幂等的方式来解决。

如何配置

根据上面的分析,下面给出大概的配置方案:

  • 生产者端:
    • 发送消息使用 producer.send(msg, callback) 而非 producer.send(msg)
    • 配置 acks = all,也就是所有的副本 Broker 都接收到消息,才算「已提交」。
    • 给消费者设置足够大的重试次数,避免消息因为网络原因等发送失败。
  • Broker 端
    • 禁止落后的 Broker 竞选新 Leader,通过配置 unclean.leader.election.enable = false 来实现。
    • 提供超过 3 个副本,通过冗余来防止丢失。
    • 配置 min.insync.replicas 的值,指定需要保存到多少个副本才算「已提交」,这个值要大于 1。
    • 确保副本数量大于 min.insync.replicas 的值,否则只要有一个副本宕机,服务就不可用了,建议比它的值大 1 即可。
  • 消费者端
    • 配置 enable.auto.commit=false 取消自动提交位移,采用消息处理完手动提交的方式。

相关 [传说 kafka 消息] 推荐:

传说中 Kafka 的 0 消息丢失配置是怎么回事

- - 掘金 后端
这是我参与11月更文挑战的第16天,活动详情查看: 2021最后一次更文挑战. 本文讨论 Kafka 的 0 消息丢失配置的实现. 之所以要先确立问题的边界,是因为,任何事都不是 100% 绝对的,要达到 0 消息丢失一定需要先确立前提. 要保证 Kafka 消息不丢失的前提有两个:. 已提交的意思是说,消息被生产者发送给 Broker,Broker 成功保存消息并告诉生产者消息已被成功提交.

apache kafka消息服务

- - CSDN博客架构设计推荐文章
apache kafka中国社区QQ群:162272557. apache kafka参考. 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息. 消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息. Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费.

kafka发布订阅消息

- - 企业架构 - ITeye博客
① 每个partition会创建3个备份replica,并分配到broker集群中; --replication-factor 3. ② 用zookeeper来管理,consumer、producer、broker的活动状态;. ③ 分配的每个备份replica的id和broker的id保持一致;.

分布式消息系统:Kafka

- - 标点符
Kafka是分布式发布-订阅消息系统. 它最初由LinkedIn公司开发,之后成为Apache项目的一部分. Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务. 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转. 传统的企业消息系统并不是非常适合大规模的数据处理.

kafka分布式消息系统

- - CSDN博客云计算推荐文章
Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录、浏览、点击、分享、喜欢)以及系统运行日志(CPU、内存、磁盘、网络、系统及进程状态). 当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线).

高性能消息系统——Kafka

- - 互联网 - ITeye博客
引用官方原文: “Kafka is a distributed, partitioned, replicated commit log service.”. 它提供了一个非常特殊的消息机制,不同于传统的mq. 官网:https://kafka.apache.org.     传统的MQ,消息被消化掉后会被mq删除,而kafka中消息被消化后不会被删除,而是到配置的expire时间后,才删除.

Kafka 的消息可靠传递

- - IT瘾-dev
Kafka提供的基础保障可以用来构建可靠的系统, 却无法保证完全可靠. 需要在可靠性和吞吐之间做取舍.. Kafka在分区上提供了消息的顺序保证.. 生产的消息在写入到所有的同步分区上后被认为是. 生产者可以选择在消息提交完成后接收broker的确认, 是写入leader之后, 或者所有的副本. 只要有一个副本存在, 提交的消息就不会丢失.

kafka:一个分布式消息系统 - 十九画生

- - 博客园_首页
最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布式实现的很奇怪,所以希望找一个适合分布式的消息系统. 以下是内容是调研过程中总结的一些知识和经验,欢迎拍砖. 首先,我们来看看什么是消息队列,维基百科里的解释翻译过来如下:.

Apache Kafka:下一代分布式消息系统

- - zzm
Apache Kafka是分布式发布-订阅消息系统. 它最初由LinkedIn公司开发,之后成为Apache项目的一部分. Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务. Apache Kafka与传统消息系统相比,有以下不同:. 它被设计为一个分布式系统,易于向外扩展;.

Kafka无消息丢失配置 - huxihx - 博客园

- -
Kafka到底会不会丢数据(data loss). 通常不会,但有些情况下的确有可能会发生. 下面的参数配置及Best practice列表可以较好地保证数据的持久性(当然是trade-off,牺牲了吞吐量). 笔者会在该列表之后对列表中的每一项进行讨论,有兴趣的同学可以看下后面的分析. 使用KafkaProducer.send(record, callback).