kafka发送消息服务器宕机,Kafka之消息传输

问题研究:

研究Kafka consumer和broker之间的数据传输方式?

Kafka是如何保证可靠性?

消费机制是consumer pull还是broker push?, 如果是push的话,kafka是否知道数据传输成功

0.写在前面

昨天整理完Kafka之数据存储之后,今天决定再把笔记中kafka消息传输部分整理一下,逐步去完善kafka系列的博文。本文中讲述的kafka是0.8.1版,目前最新版的0.9.0版把consumer的The high-level Consumer API和The SimpleConsumer API结合到了一起,这个是最新版的变化的最大之处,这个以后再讲(本来打算分两篇讲解consumer的,看来这样写了)。

1.消息传递机制

kafka在保证消息在producer和consumer之间的传输,主要有以下几种可能的delivery guaratee:

At most once:消息可能会丢,但绝不会重复传输;

At least one:消息绝不会丢,但可能会重复传输;

Exactly once:每条消息肯定会被传输一次且仅传输一次.

producer到broker端,当kafka的producer向broker发送消息时,一旦这条消息被commit,因为有replication的存在,它就不会丢失。但如果producer发送数据给broker后,遇到的网络问题而造成通信中断,那producer就无法判断该条消息是否已经commit,(这一点有点像向一个自动生成primary key的数据库表中插入数据,虽然Kafka无法确定网络故障期间发生了什么,但是producer可以生成一种类似于primary key的东西,发生故障时幂等性的retry多次,这样就做到了Exactly one。这一feature可能会在kafka未来的版本中实现),目前默认的情况下,一条消息从producer到broker是确保了At least once,但可通过设置producer异步发送实现At most once(可以在request.required.acks中设置)。

broker到consumer端(对于heigh level API),consumer在从broker读取消息后,可以选择commit,该操作会在zookeeper中存储下该consumer在该partition下读取消息的offset。该consumer下一次再读该partition时会从下一条开始读取。如未commit,下一次读取的开始位置会跟上一次commit之后的开始位置相同。当然可以将consumer设置为autocommit,即consumer一旦读到数据立即自动commit。如果只讨论这一读取消息的过程,那Kafka是确保了Exactly once。但实际上实际使用中consumer并非读取完数据就结束了,而是要进行进一步处理,而数据处理与commit的顺序在很大程度上决定了消息从broker和consumer的delivery guarantee semantic。下面介绍以下这两种情况的区别:

读完消息先commit再处理消息。这种模式下,如果consumer在commit后还没来得及处理消息就crash了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这就对应于At most once;

读完消息先处理再commit。这种模式下,如果处理完了消息在commit之前consumer crash了,下次重新开始工作时还会处理刚刚未commit的消息,实际上该消息已经被处理过了。这就对应于At least once。

如果一定要做到Exactly once,就需要协调offset和实际操作的输出。精典的做法是引入两阶段提交。如果能让offset和操作输入存在同一个地方,会更简洁和通用。这种方式可能更好,因为许多输出系统可能不支持两阶段提交。比如,consumer拿到数据后可能把数据放到HDFS,如果把最新的offset和数据本身一起写到HDFS,那就可以保证数据的输出和offset的更新要么都完成,要么都不完成,间接实现Exactly once。(目前就high level API而言,offset是存于Zookeeper中的,无法存于HDFS,而low level API的offset是由自己去维护的,可以将之存于HDFS中)。

总之,kafka默认保证At least once,并且允许通过设置producer异步提交来实现At most once。而Exactly once要求与目标存储系统协作,幸运的是kafka提供的offset可以使用这种方式非常直接非常容易。

2. 消费机制Topic:Topic在逻辑上可以认为是一个queue,每条消息必须指定它的topic,可以简单理解为把这条消息放进哪个queue里;

partition:为了使kafka的吞吐

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值