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 ...
随机推荐
- Python编程指南 chapter 1
1.python使用方括号[]来存取一个序列中的某个数据项,像字符串.列表等包含若干数据项的序列都采用这种方法. 2.强制类型转换,int('24234'),str(235) 3.python中没有变 ...
- ExtJs之字段集FieldSet
//Ext.form.FieldSet扩展自Ext.container.Container.其优点就是把相同字段集中在一起,在外面字段外面加了个线"围住"他们. // ...
- HDU 1392 Surround the Trees (Graham求凸包周长)
题目链接 题意 : 让你找出最小的凸包周长 . 思路 : 用Graham求出凸包,然后对每条边求长即可. Graham详解 #include <stdio.h> #include < ...
- C# WINFORM 捕获全局异常
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Thr ...
- listview优化 汇总
1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...
- weblogic 安装与配置
Weblogic 安装 从官网 下载 需要的weblogic 版本, 解压缩后得到 wls1036_generic.jar [fmw_12.1.3.0.0_wls.jar , fmw_12.2.1.1 ...
- React-组件嵌套-子组件通过委托向父组件传值
一.简述 父组件嵌套子组件,父组件的处理函数通过属性的方式赋值组子组件( <GenderSelect handleSelect={this.handleSelect}></Gende ...
- 【总结】你所不知道的Java序列化
我们都知道,Java序列化可以让我们记录下运行时的对象状态(对象实例域的值),也就是我们经常说的对象持久化 .这个过程其实是非常复杂的,这里我们就好好理解一下Java的对象序列化. 1. 首先我们要搞 ...
- Android 广播(内部类)
1.广播定义在一个单独的文件中 源码: public class MessageReceiver extends BroadcastReceiver{ @Override public void on ...
- RAID
RAID(is short for redundant arrays of independent disks) 独立/廉价磁盘冗余阵列.基本思想:把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使 ...