Kakfa消息投递语义

Message Delivery Semantics

  • At most once —— Messages may be lost but are never redelivered(消息可能丢失但不会重复投递)
  • At least once —— Messages are never lost but may be redelivered(消息不会丢失但可能重复投递)
  • Exactly once —— this is what people actually want,each message is delivered once and only once(消息只投递一次)

许多系统都声称提供"exactly once"投递,但是仔细阅读很重要,大部分这种宣称都是误导(他们没有考虑生产者和消费者可能失败的情况,以及多个消费者进程同时处理的情况,还有写到磁盘上的数据可能丢失的情况)

Kafka的消息投递语义是直接的。发布消息的时候我们有一个概念叫消息被提交到日志。一旦被发布的消息被提交到日志,只要有一个这个消息所在分区的broker活着消息就不会丢失。从0.11.0.0版本以后,Kafka生产者支持幂等投递选项,以保证即使消息被重新发送,日志中也不会有重复的条目。为了实现这一点,broker给没用个生成者指定一个ID并且每条消息指定一个序列号。

并不是所有的情况都需要这样强的保证。

现在,让我们站在消费者的角度来看这个语义。消费者用日志控制它的位置。如果消费者没有崩溃它仅仅只是在内存中存储这个位置,但如果消费者失败了,我们想要另一个进程来接管这个分区,那么这个新的进程需要选择一个合适的位置开始处理。让我们来看一下消费者读取消息后处理消息和更新位置的几种选项。

  1. It can read the messages,then save its position in the log,and finally process the messages.(读取消息,然后在日志中保存位置,最后处理消息)。这种情况有一种可能就是消费者在保存位置之后就崩溃了。这情况下接管的进程会从保存的那个位置开始处理,即使在这个位置之前有一些消息没有被处理也不管了。这与"at-most-once"的语义是一致的,在这种情况下,消费者处理失败的那些消息就不会被处理了。
  2. It can read the messages,process the messages,and finally save its position.(读取消息,然后处理消息,最后保存位置)。这种情况下有一种可能是消费者在处理消息之后保存位置之前就崩溃了。这种情况下,新的进程接管以后会接收到一些之前已经被处理过的消息。这与"at-least-once"的语义是一致的。在许多情况下,消息有一个主键,以至于更新是幂等的(接收相同的消息两次,重写日志记录)。

 

The consumer's position is stored as a message in a topic,so we can write the offset to Kafka in the same transaction as the output topics receiving the processed data. If the transaction is aborted,the consumer's position will revert to its old value and the produced data on the output topics will not be visible to other consumers,depending on their "isolation level." In the default "read_uncommitted" isolation level,all messages are visible to consumers even if they were part of an aborted transaction,but in "read_committed," the consumer will only return messages from transactions which were committed (and any messages which were not part of a transaction).

 

当从主题消费并生产到另一个主题的时候,我们可以用事务生产者。消费者的位置作为消息被存储在topic中,以至于我们可以在接收处理数据的那个事务中将offset写到kafka。如果事务被中止,消费者的位置会恢复成旧值并且生产的数据对其它消费者不可见,这取决于隔离级别。默认的隔离级别是"read_uncommitted"表示消息对所有消费者可见,即使有些消息来自被中止的事务。

 

总结

1、消息投递语义

  最多一次:可能丢失消息但不会重复投递

  最少一次:不会丢失消息但可能重复投递

  精确一次:只会投递一次

2、kafka给每个生产者指定一个ID,每个发布的消息一个序列号,这样的话即使生产者重复发送消息,在提交日志中也不会有重复记录

3、站在消费者的角度,先保存位置后处理消息就是“最多一次”;先处理消息后保存位置就是“最少一次”;至于“精确一次”,可以使用事务生产者来实现,即在同一个事务中接收并处理消息,将位置(offset)保存到另一个topic中。只要事务成功了,皆大欢喜,若事务失败,则位置恢复。

 

参考 http://kafka.apache.org/documentation/#design

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读4.1k次。kafka认证_kafka认证
文章浏览阅读4.8k次,点赞4次,收藏11次。kafka常用参数_kafka配置
文章浏览阅读1.4k次,点赞25次,收藏10次。Kafka 生产者发送消息的流程涉及多个步骤,从消息的创建到成功存储在 Kafka 集群中。_kafka发送消息流程
文章浏览阅读854次,点赞22次,收藏24次。点对点模型:适用于一对一的消息传递,具有高可靠性。发布/订阅模型:适用于广播消息给多个消费者,实现消息的广播。主题模型:适用于根据消息的主题进行灵活的过滤和匹配,处理复杂的消息路由需求。
文章浏览阅读1.5k次,点赞2次,收藏3次。kafka 自动配置在KafkaAutoConfiguration
文章浏览阅读1.3w次,点赞6次,收藏33次。Offset Explorer(以前称为Kafka Tool)是一个用于管理和使Apache Kafka ®集群的GUI应用程序。它提供了一个直观的UI,允许人们快速查看Kafka集群中的对象以及存储在集群主题中的消息。它包含面向开发人员和管理员的功能。二、环境信息系统环境:windows 10版本:2.2Kafka版本:Kafka2.0.0三、安装和使用3.1 下载Offset Explorer 和安装下载到本地的 .exe文件Next安装路径 ,Next。_offset explorer
文章浏览阅读1.3k次,点赞12次,收藏19次。kafka broker 在启动的时候,会根据你配置的listeners 初始化它的网络组件,用来接收外界的请求,这个listeners你可能没配置过,它默认的配置是listeners=PLAINTEXT://:9092就是告诉kafka使用哪个协议,监听哪个端口,如果我们没有特殊的要求的话,使用它默认的配置就可以了,顶多是修改下端口这块。
文章浏览阅读1.3k次,点赞2次,收藏2次。Kafka 是一个强大的分布式流处理平台,用于实时数据传输和处理。通过本文详细的介绍、使用教程和示例,你可以了解 Kafka 的核心概念、安装、创建 Topic、使用生产者和消费者,从而为构建现代分布式应用打下坚实的基础。无论是构建实时数据流平台、日志收集系统还是事件驱动架构,Kafka 都是一个可靠、高效的解决方案。_博客系统怎么使用kafka
文章浏览阅读3.5k次,点赞42次,收藏56次。对于Java开发者而言,关于 Spring ,我们一般当做黑盒来进行使用,不需要去打开这个黑盒。但随着目前程序员行业的发展,我们有必要打开这个黑盒,去探索其中的奥妙。本期 Spring 源码解析系列文章,将带你领略 Spring 源码的奥秘。本期源码文章吸收了之前 Kafka 源码文章的错误,将不再一行一行的带大家分析源码,我们将一些不重要的分当做黑盒处理,以便我们更快、更有效的阅读源码。废话不多说,发车!
文章浏览阅读1.1k次,点赞14次,收藏16次。一、自动提交offset1、概念Kafka中默认是自动提交offset。消费者在poll到消息后默认情况下,会自动向Broker的_consumer_offsets主题提交当前主题-分区消费的偏移量2、自动提交offset和手动提交offset流程图3、在Java中实现配置4、自动提交offset问题自动提交会丢消息。因为如果消费者还没有消费完poll下来的消息就自动提交了偏移量,那么此时消费者挂了,于是下一个消费者会从已经提交的offset的下一个位置开始消费消息。_kafka中自动提交offsets
文章浏览阅读1.6k次。如果生产者发送消息的速度超过发送到服务器的速度,则会导致生产者空间不足,这个时候KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,这个取决于参数max.block.ms的配置,此参数的默认值为60000,即60秒。在默认情况下,生产者发送的消息是未经压缩的。如果应用程序调用send()方法的速度超过生产者将消息发送给服务器的速度,那么生产者的缓冲空间可能会被耗尽,后续的send()方法调用会等待内存空间被释放,如果在max.block.ms之后还没有可用空间,就抛出异常。_kafka producer 参数
文章浏览阅读2.9k次,点赞3次,收藏10次。kafka解决通信问题_kafka3.6
文章浏览阅读1.5k次,点赞9次,收藏11次。上面都配置完了之后可以先验证下,保证数据最终到ck,如果有问题,需要再每个节点调试,比如先调试nginx->rsyslog ,可以先不配置kafka 输出,配置为console或者文件输出都可以,具体这里就不写了。这里做了一个类型转换,因为nginx,request-time 单位是s,我想最终呈现在grafana 中是ms,所以这里做了转换,当然grafana中也可以做。kafka 相关部署这里不做赘述,只要创建一个topic 就可以。
文章浏览阅读1.4k次,点赞22次,收藏16次。Kafka中的enable-auto-commit和auto-commit-interval配置_auto-commit-interval
文章浏览阅读742次。thingsboard规则链调用外部 kafka_thingsboard kafka
文章浏览阅读1.3k次,点赞18次,收藏22次。Kafka_简介
文章浏览阅读1.1k次,点赞16次,收藏14次。在数据库系统中有个概念叫事务,事务的作用是为了保证数据的一致性,意思是要么数据成功,要么数据失败,不存在数据操作了一半的情况,这就是数据的一致性。在很多系统或者组件中,很多场景都需要保证数据的一致性,有的是高度的一致性。特别是在交易系统等这样场景。有些组件的数据不一定需要高度保证数据的一致性,比如日志系统。本节从从kafka如何保证数据一致性看通常数据一致性设计。
文章浏览阅读1.4k次。概述介绍架构发展架构原理类型系统介绍类型hive_table类型介绍DataSet类型定义Asset类型定义Referenceable类型定义Process类型定义Entities(实体)Attributes(属性)安装安装环境准备安装Solr-7.7.3安装Atlas2.1.0Atlas配置Atlas集成HbaseAtlas集成SolrAtlas集成KafkaAtlas Server配置Kerberos相关配置Atlas集成HiveAtlas启动Atlas使用Hive元数据初次导入Hive元数据增量同步。_atlas元数据管理
文章浏览阅读659次。Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端。
文章浏览阅读1.4k次。Kafka-Kraft 模式架构部署_kafka kraft部署