kafka设计原理以及应用

kafka是分布式流处理平台,并且具有高容错性和消费及时性的特点。那么它是如何做到的呢?
一  kafka简介
1 主题和日志
topic和log设置是kafka一大特色,一个kafka集群可以创建多个topic,每个topic都相当于一个消息队列,这就意味着可以将不同格式的数据发布到不同的topic中,减少消费这些数据时的逻辑难度,那么每个topic中处理的数据结构是怎样的呢?看一一张topic的剖析图。

从上图可以看到,消息传送过来时,kafka会通过负载均衡将消息最终写入到磁盘上的一个partition,由于在同一个partition上这些消息都是顺序存储的,所以对一个特定分区每条消息都会有一个基于起始位置的偏移量offset,因此在后续消费时只需要指明从哪个partition中的哪个offset开始消费,就能达到重复消费的目的。
1)虽然kafka可以通过增加partition方式来增加负载,但是它的数据最终是要写入磁盘中。机械磁盘驱动器吞吐量跟寻道延时是强关联的,也就是,线性读写速度远大于随机读写,大约是6000倍的差距,kafka采用的就是线性读写,设置partition的数量固然可以增加topic的负载,但是partition数量过对会导致cpu计算量增大,最佳的办法是根据配置不同的业务场景来设置不同的partition
2)offset的存储类型是什么,如果消息足够大,offset的值是否会重新设置为0,如果设置为0,后续消费是否会紊乱?
kafka offset是一个日志序列号 log sequence number ,这个到底有多大呢,举个例子,如果一个partition一天接受1T日志,这个offset可以使用一百万年,由于offset够用,而且不会设置为0,所以消费紊乱的情况不会出现。
3)可以通过配置log.retention参数设置消息过期时间,超过过期时间的消息会被系统删除,删除的消息不可再被重新消费。
2 分布式集群
为保证业务的稳定,kafka采用了集群模式,一旦一台机器出现故障了,可以选择链接其他机器,保证业务稳定性,每个partition都会有一个服务器来作为领导者leader,另外一个或者多个服务器server来作为follower,leader会处理所有的读写请求,而follower会从leader那里备份数据,如果一个leader失败了,其它的follower会自动选举一个成为一个新的leader,所以对于一个server来说,它可能是某些partition下的leader,而对于另外一些partition来说,则是follower。
3 生产者消费者和消息的顺序性
上面讲的那么多,无非是要实现一个队列的数据结构,对于队列这种数据结构我们一点都不陌生,由此可以想到对于kafka这样的topic队列来说,生产消费逻辑应该是这样:有很多生产者向topic中写入数据,另外一端则有许多消费者消费数据。

然而实际上kafka生产者消费者模式有它的特殊性,那么kafka的这个队列是怎样实现入队和出队的?接下来我们一起来看看kafka生产者消费者模式。
生产者:producer 就是向kafka队列中发布消息的,即入队操作,生产者在topic中选择一个partition然后向这个partition中发送数据。选择partition的过程就是一个负载均衡的方式,比如采用轮询或者自己设定partition选择函数来实现负载均衡。
消费者:consumer功能是从队列中读取数据并进行相应逻辑处理,但是kafka消费者有特殊之处, kafka增加了一个组group的概念,一个topic可以有多个group,一条消息将被发往所有组,但是在组内,这条消息只会被一个consumer消费。由此说来一个group才是真正逻辑消费者。
消费顺序性:其实在高等级的api中由于指定了负载均衡规则,同一个生产者发布两条不同消息数据时会根据相应规则发送到一个特定partition中,在消费时会按照同样规则从partition中取出数据。这样就能保证数据消费的先后顺序。
1)对于一个具有多个consumer的topic,我要实现一条消息被多个consumer消费和一条消息只被一个consumer消费,那怎么设置group?
将多个consumer设置为同一个组可以实现一条消息只被一个consumer消费,将所有的consumer设置到不同组,一条消息将会被所有consumer消费。
2)如果有一批数据消费时必须严格按照入队先后顺序来消费,需要怎样设置生产者和消费者
如果数据量小,可以将topic设置为一个partition,如果数据量较大,可以将一个生产者写死负载均衡函数,将数据发送到一个特定的partition上,消费数据时指定消费者消费的partition和offset来顺序消费数据。

二  ,  kafka应用的介绍
1 在垂直搜索中的应用:
我们知道搜索引擎需要定时对文档进行更新,如果我们把需要更新内容暂存到kafka,这样索引更新时,只要从对应partition中从上一次取过的offset处继续取数据,就能达到增量更新目的,而过期数据会被自动清理,较少了操作冗余性和复杂性。
2 在用户画像以及相关推荐中的应用:
相关推荐之前的海量item数据上报对数据准确性要求较高,试想如果一条item数据因为处理失败而没有被正确入库,那么相关推荐时就永远不会出现这条item, 所以这就对“可回滚”提出了更加严格的要求。而在kafka中也只需要将消费的offset重新设置为消费失败时的offset,修复入库问题重新消费即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值