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 ...
随机推荐
- ZOJ3718 Diablo II(状态压缩dp)
题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
- ==和equals的区别
== :是判断两个变量或实例是不是指向同一个内存空间equals :是判断两个变量或实例所指向的内存空间的值是不是相同 结论:欲比较栈中数据是否相等,请用= =:欲比较堆中数据是否相等,请用equal ...
- JSON.stringify 函数 (JavaScript)
在bsrck项目中,使用jQuery.Form.js的ajaxSubmit时,遇到有文件上传的form提交,在firefox和chrome浏览器中测试,报Bad Request的错误,经查代码后发现是 ...
- QTP10.0安装说明
QTP10.0 安装手册 注:安装之前检查清理相关注册表:运行->regdit-HKEY_LOCAL_MACHINE->HKEY_LOCAL_MACHINE\SOFTWARE->HK ...
- 传入sql数组字符串,输出table
CREATE function [dbo].[split](@aString varchar(),@pattern varchar()) returns @temp table([Sid] [, ) ...
- spring PropertyPlaceholderConfigurer 找不到配置文件原因
1: spring 版本问题 参见: http://www.cnblogs.com/alex-blog/archive/2012/12/25/2832357.html 2: bean id 同名 ...
- Hbase Shell命令
1 启动HBase shell 2 HBase shell 命令 3 我们将以“一个学生成绩表”的例子来详细介绍常用的 HBase 命令及其使用方法. 这里 grad 对于表来说是一个列,course ...
- Linux Shell查看磁盘分区,内存使用,CPU使用率
Linux Shell查看磁盘分区,内存使用,CPU使用率 #!/bin/bash #disk_used_rate Location=/dev/xvdb Disk_Used_Rate=$(df -h ...
- SQLHelper.cs的经典代码-存储过程
using System; using System.Collections.Generic; using System.Text; using System.Collections; using S ...