Kafka是什么,架构是什么样的?Kafka概述
Kafka是一个高性能,高扩展性,高可用,支持消息持久化的消息队列
Kafka本质就是一个消息队列,说白了就是一个链表,链表的每个节点就是一个消息,每个节点有一个序号,叫做offset,用来记录消息的位置
假设有两个服务,A服务和B服务,A服务发送消息200qps,B只有100qps的处理能力,这时候就需要一个中间件来缓和一下A和B的关系,而B依据自己的消费能力消费链表中的消息,不断的更新已处理消息的offset的值
Kafka高性能
其中,此消息队列是一个单独进程,producer发送消息到不同的topic,topic中又分为一个个的partition,一个消费者消息一个partition的信息,这样就减少了消息争抢的情况
Kafka高扩展性
如果partition过多,可能会影响单机cpu和内存过高,从而影响性能,这时候就可以把partition分散到不同的机器中,这样的一台机器我们称为一个broker,这样我们就可以通过增加broker来分散压力。
Kafka高可用
到这里还有个问题,如果broker挂了,那么broker中的partition里的消息也就没了,解决方法就是给partition加备胎
我们可以给partition多增加几个副本,他们统称replicas,将replicas中的partition分为leader和follower,关系如图
leader负责生产者和消费者的读写请求,follower负责同步leader的消息,将leader和follower分散到不同的broker上,这样leader所在的broker挂了也不会影响follower所在的broker,并且还能选举一个新的leader顶上
Kafka的持久化和过期策略
如果broker都挂了那数据不就都没了?
所以我们还要把数据持久化到磁盘中,但是磁盘的容量也是有限的,所以我们要给数据加上保留策略(retention policy)如果磁盘数据超过一定大小或者消息存放超过一定时间,就会被清理掉
consumer group
还有个问题就是,按照现在的消费策略,新增的消费者只能跟着最新的offset接着消费,如果我想消费者从某个指定的offset进行消费呢?
于是我们引入消费者组(consumer group)的概念,groupA和groupB,不同的消费者组维护自己的消费进度
zookeeper
到现在,组件太多了,而且每个组件都有自己的数据和状态,zookeeper就是用来统一维护这些组件的状态信息,它会定期和broker通信和获取整个Kafka集群的状态,比如:某些broker是不是挂了,某些consumer group消费到哪了
Kafka的应用场景
对流量进行削峰填谷,秒杀活动,大数据和日志的异构同步