Kafka delivery保证(kafka消息投递保证)
来源:互联网 发布:福州地铁软件 编辑:程序博客网 时间:2024/05/01 06:18
有这么几种可能的delivery guarantee:
- At most once 消息可能会丢,但绝不会重复传输
- At least one 消息绝不会丢,但可能会重复传输
- Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的。
当Producer向broker发送消息时,一旦这条消息被commit,因数replication的存在,它就不会丢。但是如果Producer发送数据给broker后,遇到网络问题而造成通信中断,那Producer就无法判断该条消息是否已经commit。虽然Kafka无法确定网络故障期间发生了什么,但是Producer可以生成一种类似于主键的东西,发生故障时幂等性的重试多次,这样就做到了Exactly once。目前这一Feature还并未实现,有希望在Kafka未来的版本中实现。(所以目前默认情况下一条消息从Producer到broker是确保了At least once,可通过设置Producer异步发送实现At most once)。
- 读完消息先commit消费状态(保存offset)再处理消息。这种模式下,如果Consumer在commit后还没来得及处理消息就crash了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这就对应于At most once
- 读完消息先处理再commit消费状态(保存offset)。这种模式下,如果在处理完消息之后commit之前Consumer crash了,下次重新开始工作时还会处理刚刚未commit的消息,实际上该消息已经被处理过了。这就对应于At least once。在很多使用场景下,消息都有一个主键,所以消息的处理往往具有幂等性,即多次处理这一条消息跟只处理一次是等效的,那就可以认为是Exactly once。(个人感觉这种说法比较牵强,毕竟它不是Kafka本身提供的机制,主键本身也并不能完全保证操作的幂等性。而且实际上我们说delivery guarantee语义是讨论被处理多少次,而非处理结果怎样,因为处理方式多种多样,我们不应该把处理过程的特性——如是否幂等性,当成Kafka本身的Feature)
- 如果一定要做到Exactly once,就需要协调offset和实际操作的输出。经典的做法是引入两阶段提交。如果能让offset和操作输入存在同一个地方,会更简洁和通用。这种方式可能更好,因为许多输出系统可能不支持两阶段提交。比如,Consumer拿到数据后可能把数据放到HDFS,如果把最新的offset和数据本身一起写到HDFS,那就可以保证数据的输出和offset的更新要么都完成,要么都不完成,间接实现Exactly once。(目前就high level API而言,offset是存于Zookeeper中的,无法存于HDFS,而low level API的offset是由自己去维护的,可以将之存于HDFS中)
参考资料
http://kafka.apache.org/documentation.html#semantics
http://www.jasongj.com/2015/03/10/KafkaColumn1/
0 0
- Kafka delivery保证(kafka消息投递保证)
- Kafka消息delivery可靠性保证(Message Delivery Semantics)
- kafka保证消息交付
- Kafka消息保证不丢失
- 如何保证kafka 的消息机制
- 如何保证kafka 的消息机制
- 如何保证kafka 的消息机制
- storm读kafka数据源保证消息不丢失的方法
- 【分布式】--消息kafka保证消顺序一致性(358)
- webim如何保证消息的可靠投递
- KafKa数据存储与数据一致性保证
- IM消息送达保证机制实现(二):保证离线消息的可靠投递
- 想比较传统消息系统,kafka可以很好的保证有序性~
- Kafka Consumer机制优化-保证每条消息至少消费一次
- kafka的topic多分区的情况,如何保证跨区的消息消费的顺序性
- Kafka-Delivery Guarantee
- (场景)kafka的topic多分区的情况,如何保证跨区的消息消费的顺序性
- Spark Streaming使用Kafka保证数据零丢失
- DD命令
- 你应该首先保护哪些应用程序?这个问题本身问错了!
- c++ String普通构造函数,拷贝构造函数,赋值函数书写
- iOS:An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)
- web统计访问量
- Kafka delivery保证(kafka消息投递保证)
- Android 自定义View (三) 圆环交替 等待效果
- ListView几个比较特别的属性
- ios-day11-02(控制器的多种创建方式。init方法创建、通过storyboard的创建、通过xib创建)
- 一步一步写算法(之hash表)
- DNS bind9配置
- python的Socketserver模块使用,异常处理
- Linux下DISPLAY环境变量的作用
- iOS 清空缓存(递归计算沙盒目录大小)