Kafka中的Message Delivary机制
学习Kafka的读书笔记,暂未把文章设为翻译类型,因为并非直译文档。水平有限,还请路过高手指正。
<1> “最多(发送)一次”(At most once):消息可以丢失但绝不会重新发送;
<2> “至少(发送)一次”(At least once):消息绝不会丢失但是可能会被重新发送;
<3> “仅(发送)一次”(Exactly once): 这是实际应用中最希望看到的,每个消息只会被发送一次且不会丢失;
从生产者角度,一个producer可以选择是否异步发送:
1> 若不选择异步发送,Producer在发送一个消息之后得不到及时ack的话,会继续重发,知道得到ack为止;(至少(发送)一次)
2> 若选择异步发送,Producer在发送一个message后就继续接下来的消息发送,而不管消息是否最终发送成功;(最多(发送)一次)
从消费者角度,一个Kafka Consumer有三种选择:
1> 读取N条消息(一批消息) ---> 保存最后一个消息之后要处理的Message Possition至log ---> 处理消息。 该流程保证“最多(发送)一次”:如果保存消息Position成功,但在处理消息完成前Consumer crash, 新的Consumer进程将从记录的position继续往下处理,因而有消息会被漏掉(未经处理).
2> 读取N条消息 (一批消息)---> 处理消息 ---> 记录最后一个消息之后要处理的Message Possition至log。 该流程保证“至少(发送)一次”:如果处理消息过程中consumer crash, 新的consumer进程在接管时会从上一次处理的末尾Position开始,一些消息可能会被重发发送。
3> 处理消息过程中,将每个消息的Position和消息本身存放在同一地方,要么Position和Message都update, 要么都没有。该流程可保证“仅(发送)一次”。当某个消息处理失败(Consumer挂掉),新的Consumer进程可以通过最后一个处理的Message position保证不会重复处理消息。
总的来说,Kafka默认支持“至少(发送)一次”;
如果用户希望支持“最多(发送)一次”,可以在producer端选择异步发送(关闭retry功能),并且在处理一个批次消息前先记录该批次消息最后一个消息的Position。
若要实现“仅(发送)一次”,Kafka提供了Message Offset, Consumer可以同步保存每个消息的Offset和Message本身,所以实现“仅(发送)一次”比较方便。
Push vs Pull:
Push model不能适应不同消费者的消费能力和使用场景。理解起来很简单,消费者A每分钟只能处理10条消息,但Broker可能以每分钟100条的速率发送给A,这显然不合理。
Pull-based model可以由消费者根据自身的处理能力选择性的批处理消息,可以减少不必要的延迟产生(每次通过网络发送一个消息,会有会话延迟)
Kafka中的Message Delivary机制的更多相关文章
- kafka学习之-文件存储机制
Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx ...
- Apche Kafka 的生与死 – failover 机制详解
Kafka 作为 high throughput 的消息中间件,以其性能,简单和稳定性,成为当前实时流处理框架中的主流的基础组件. 当然在使用 Kafka 中也碰到不少问题,尤其是 failover ...
- kafka中server.properties配置文件参数说明
转自:http://blog.csdn.net/lizhitao/article/details/25667831 参数 说明(解释) broker.id =0 每一个broker在集群中的唯一表示, ...
- Apche Kafka 的生与死 – failover 机制详解
转自:http://www.cnblogs.com/fxjwind/p/4972244.html Kafka 作为 high throughput 的消息中间件,以其性能,简单和稳定性,成为当前实时流 ...
- Kafka——副本(Replica)机制
副本定义 Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区.副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本. 所谓副本(Replica),本质就是一个只能追加写消息的提交 ...
- flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习
1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...
- Kafka中非常值得学习的优秀设计
一.Kafka基础 消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用. 引入一个场景,我们知道中国移动,中国 ...
- javascript中的错误处理机制
× 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...
- 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制
本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...
随机推荐
- Ogre1.8.1源码编译
本文的编译环境为Windows7_SP1 + VS2010_SP1 + CMake2.8.11 :) 资源下载 1. 下载Ogre1.8.1的源代码,下载链接地址:http://www.ogre3 ...
- MYSQL 遭遇 THE TOTAL NUMBER OF LOCKS EXCEEDS THE LOCK TABLE SIZE
今天进行MySql 一个表数据的清理,经过漫长等待后出现 The total number of locks exceeds the lock table size 提示.以为是table_cache ...
- js的in运算符与instanceof运算符
in运算符:希望他的左操作数是一个字符串或可以转换为字符串,希望他的右操作数是一个对象.如果右操作数的对象拥有一个名为左操作数值的属性名,那么表达式返回true. var point= {x:1,y: ...
- ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
ScriptManager.RegisterStartupScript方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStartu ...
- lintcode:Wiggle Sort II
Wiggle Sort II Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] ...
- ubuntu挂载磁盘
1.首先查磁盘UUID:sudo blkid 2.打开挂载文件:sudo /etc/fstab 3.写挂载文件: UUID=000860AE000FDD66 /mnt/disk1 ...
- BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别
一.简介: BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean 通常包含了大量的属性,很多情况下,对Jav ...
- Windows 下 玩转Node.JS
vs一直是用的比较舒服的IDE,一直期望可以支持Node.JS.终于找到了一个工具 NTVS(Node.JS Tool For VS). 主页:https://nodejstools.codeplex ...
- Spring框架学习之第6节
bean的生命周期 为什么总是一个生命当做一个重点? Servlet –> servlet生命周期 Java对象生命周期 往往笔试,面试总喜欢问生命周期的问题? ① 实例化(当我们的程序加载 ...
- Java实现Mysql数据导入导出
package com.backup; import java.io.BufferedReader;import java.io.FileInputStream;import java.io.File ...