Kafka Message Dilivery Semantics
在Apache Kafka 中确保哪些消息投递语义:
为了高效,Apache Kafka 默认确保 at-least-once 投递语义,同时允许使用者通过Producer 取消重试 同时在批量处理消息前提交Offset来实现at-most-once 语义。
但是Exactly-once 投递语义需要目的存储系统合作来实现。但是Kafka 提供OffSet 可以使使用者简单容易的来实现Exactly-once 的语义。
现在,我们了解了一些关于Producer 和Consumer工作原理,那么让我们一起讨论Kafka提供关于消息在Producer和Consumer之间传递的语义
在Kafka中提供多种消息传递语义:
1、At-Most-Once :消息可能丢失但是绝对不会重传。
2、At-Least-Once: 消息绝对不会丢失,但是可以发生重传现
3、Exactly-Once:这是使用者期望的,每一个消息仅仅被发送一次,有且只有一次。
消息传递语义可以被分为两个问题: 发送消息的持久性确保和消费者消费一个消息的确保。
在许多系统中都声称提供了 Exactly -Once 消息发送语义,但是,注意约束条件是非常重要的。大部分系统声称具有误导性。
包括:1 、消费者或者生产者可能宕机。2、可能存在多个消费者消费消息 3、写入到磁盘的数据可能会丢失。
Kafka 消息传递语义非常简单。 当发布一个消息时,我们有一个消息被 commited 到log的概念。一旦消息被commited到之中后,这个消息就不会丢失。
在Kafka中对于生产者没有强制性的投递语义。 虽然,我们在网络发生错误的情况下,我们不知道上面将会发生,但是,允许一个生产者产生一个“”“业务主键”
并且重试生产请求的幂等是完全可以的。在一个有重复的系统中是非常重要的。因为,在一个服务器失败的情况下,这样依旧可以工作。
在这个特点下,这样有足够满足,生产者可以多次重试,直到生产者得到明确确认消息被发送成功。 这样,我们就可以确保消息被commited 并且消息被exactly -once发送。
让我们来讨论一下Consumer 的消费语义。 所有的复制都明确的拥有相同的Offset 。 消费者本身控制着在log中的位置。
如果一个消费者从不宕机,那么就可以确保在内存中存储position .但是,当一个消费者宕机后,那么另外一个进程需要选择一个合适的位置开始消费。
那么另外一个进程可以有多个选择的位置来消费进程并且更新位置:
1、先读取消息,然后保存position ,最后处理消息。 At-Most-Once .
在这种情况下,如果当保存position 后,在保存输出消息处理进度前,消息者进程宕机了。那么另外一个进程将会从保存的position开始处理.
虽然,可能在保存点之前有几个消息未处理,
在At-Most-Once 语义之下, 失败的消息可能就不会被处理。
2、先读取消息,然后处理消息,最后保存position.
Kafka Message Dilivery Semantics相关推荐
- kafka-12-Kafka消息时间戳kafka message timestamp
参考Kafka消息时间戳(kafka message timestamp) 1 Kafka消息的时间戳 在消息中增加了一个时间戳字段和时间戳类型. 目前支持的时间戳类型有两种:CreateTime和L ...
- Kafka—简明教程
目录 学习目标: 一.Kafka发展历程 1.Kafka一代 - 消息队列 2.Kafka二代 - Partition 3.Kafka三代 - Broker集群 二.Kafka的消息结构? 三.Zoo ...
- [Big Data - Kafka] kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许 ...
- Kafka 基本原理(8000 字小结)
简介 Kafka架构 Kafka存储策略 Kafka删除策略 Kafka broker Kafka Design The Producer The Consumer 复制(Replication) 日 ...
- 《kafka中文手册》- 构架设计(一)
4. DESIGN 设计 4.1 Motivation 目的 4.2 Persistence 存储 Don't fear the filesystem! 不要对文件系统感到恐惧 Constant Ti ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- Kafka 基本原理
简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...
- 「中间件系列一」kafka消息中间件
kafka消息中间件 一:为什么需要消息中间件? 1.解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一 ...
- kafka整理笔记笔记
一.为什么需要消息系统 解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息 ...
最新文章
- Vue组件绑定自定义事件
- 思路+步骤+方法,三步教你如何快速构建用户画像?
- 超市收银程序_超市收银系统案例|千平超市再开2家,星耀助力门店年关创收...
- python logger.debug_Python logger模块
- django-内网项目上线测试部署步骤
- 关注CIO:IT运维如何实现“向管理要效益”(转载)
- FL2440移植LINUX-3.4.2 -- 按键驱动和触摸屏驱动移植
- SDCC 2016数据库峰会(深圳站)学习笔记
- Java基础学习-IO流
- 骚年快醒醒,你适合转行做前端吗?
- Java进阶1. Synchronized 关键字
- .NET Framework第一二课(7/26、27)
- excel 度分秒转换经纬度
- 微信小程序底部导航栏
- C语言如何使用三角函数
- 理解Liang-Barsky裁剪算法的算法原理
- 微软云+Servlet实现图片上传接口
- Mac 下 NVM 的安装与使用
- 学会python爬虫,这简直就是二次元宅男的福利
- 7-6 输入数据范围的简单判断7-7 计算半圆面积和弧长
热门文章
- springboot毕设项目电子竞技赛事管理系统f1v55(java+VUE+Mybatis+Maven+Mysql)
- mail,at,batch,sleep小练习
- Google Play App Signing 更换签名
- Ubuntu的安装、更新、下载软件命令
- Kanzi学习之路(6):属性绑定
- 《塞尔达传说》与氛围游戏的兴起:在游戏中感受禅意
- 电商平台中的9种共性推荐策略
- Acme CAD Converter 的线宽要怎么设置啊
- Linux下载安装Netcat
- 从交互设计“流行元素”中启发