kafka的模型诠释

kafka是目前市场上比较流行的消息框架。本篇文章尽力去诠释kafka模型背后的设计原理,从而更加深刻的理解kafka,在使用过程中尽可能少的入坑。

三个角色

producer:生产者。负责发送消息到kafka集群

broker:kafka集群。负责保存消息

consumer:消费者。负责消费kafka集群的消息


模型

topic:一个topic即一个逻辑上的主题,生产者可以生产消息到该主题,消费者则从该主题下消费消息。对于生产者和消费者而言,并不需要关心某个topic是怎么存的,存在哪台机器这些物理信息。

partition:partition是物理上的,每个topic可以有多个partition。这里引出一个问题,对于外界而言,一个topic已经足够,为什么还要设计partition这个模型

这是因为,利用partition可以做水平扩张,负载均衡。假设一个topic消息量巨大,单机支撑这个topic就会出现IO瓶颈,如果要想法去掉这个瓶颈,最简单能想到的就是将一个topic分散在多台机器,用多台机器来分散IO。所以partition的目的就是将同一个topic分散到不同机器上,从而实现水平扩展的利器。


借用知乎上的一个例子:

kafka正是借用生活中的例子来设计的topic和partition。其中,不同的topic就是不同的高速公路,partition就是某条高速公路上面的车道,如果车流量大,则拓宽车道,反之,减少车道;而消费者就好比收费站,收费站越多,则通过速度越快。


consumer group:consumer group实际上就是一组consumer的集合。它的出现是基于两个需求。一,在应用消费kafka消息时,希望不会重复消费。二,有时应用需要并行消费。对于这两个看似矛盾的需求,kafka通过引入consumer group来解决了。

先看第一,如果kafka不能解决重复投递,而由每个应用去解决,则每个应用自己去实现幂等,显然是一种重复造轮子的行为。对于第二,有时数据既需要传递给离线计算又需要给在线计算。kafka规定了,同一个consumer group内部,只能有一个consumer消费某条消息;而不同的consumer group,可以同时消费某条消息。简单说,如果同一个应用有100台机器,这100台机器属于同一个consumer group,则同一条消息在100台机器中只有一台能得到。而另一个应用如果也需要同时消费同一个topic的消息,则新建一个consumer group并消费同一个topic消息。

partition和consumer group之间的关系:partition的设计初衷是通过增加partition让consumer能够并发消费,但是kafka的设计是在同一个partition上不允许并发,因此,如果consumer group中的consumer线程数量比partition多,则有的线程将得不到消息;反之,如果consumer线程数量比partition少,则有的线程将会收到多个消息,多个partition间的消息并不能保证顺序,只有同一个partition上的数据是有序的。


消息顺序

如果topic中仅分配了一个partition,kafka能够保证消息的顺序投递,并且由于同一个consumer group只有一个consumer,在消费时也能保证消息的顺序,实际上就是串行的处理消息。而如果想要保证消息的处理顺序又想要并行化的进行消息投递处理,就不得不自行在consumer端处理。当然,还有个办法,即因为可以保证局部partition消息的顺序性,只要将需要保持顺序的消息通过特定的hash编码放到特定的partition中,则该组partition消息即可保证顺序访问。


消息队列需要解决的几个难题

1. 消息的顺序性


2. 消息的重复性


3. 事务消息


(待续)


kafka与unix管道 http://zqhxuyuan.github.io/2016/01/05/2016-01-05-Kafka-Unix/

Kafka是个奇葩! http://www.csdn123.com/html/topnews201408/21/1021.htm

Kafka——分布式发布订阅消息系统 https://www.zybuluo.com/sasaki/note/268115

kafka入门介绍 http://orchome.com/5

kafka设计原理介绍 https://www.dexcoder.com/dexcoder/article/2194

Kafka 指南 http://wdxtub.com/2016/08/15/kafka-guide/

Kafka史上最详细原理总结 http://blog.csdn.net/u013573133/article/details/48142677

apache kafka技术分享系列(目录索引) http://blog.csdn.net/lizhitao/article/details/39499283

阿里RocketMQ如何解决消息的顺序&重复两大硬伤? http://dbaplus.cn/news-21-1123-1.html

如何做到“恰好一次”地传递数十亿条消息 http://blog.jobbole.com/111809/?utmsource=blog.jobbole.com&utmmedium=relatedPosts

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值