Kafka原理详解

来源:互联网 发布:c语言函数查询工具 编辑:程序博客网 时间:2024/06/06 12:46

Kafka是基于消息发布-订阅模式实现的消息系统,其主要涉及有以下特点:

1,  消息持久化:以时间复杂度为O(1)的方式提供消息持久能力。

2,  分布式:支持消息分区以及分布式消费,并保证分区内的消息顺序。

3,  伸缩性:支持水平扩展。

4,  高吞吐:在廉价的商用机器上也能支持单机每秒10万条以上的吞吐。

 

Kafka投递原理整体上相同(都是Producer-Broker-Consumer),内核上不同。

Broker:跟RabbitMQ的Broker意义相同,就是MQ的Server。

Producer:消息投递者,跟RabbitMQ一样。

Consumer:消息消费者,跟RabbitMQ一样。

Partition:Broker中物理上的分区,每个partition对应一个文件夹,消息被压存和被消费的存储空间,每个Partition只能属于一个Topic。一个Topic可以有多个Partition,Partition的多少决定了Topci的吞吐量的大小。

Topic:比较难理解比较尴尬的一个概念,位置上相当于RabbitMQ的Exchange,消息投递第一个到达的地方,逻辑上相当于Queue,Producer和Consumer必须指定要生产和消费哪个Topic。一个Topci下管理的多个Partition要有一个Leader,Leader的选取是由ZooKeeper的自主选举决定的。

Consumer Group:如果一个Topic被多组Consumer Group消费,一旦有消息投递过来,每个组内只能有一个Consumer能消费到这个消息,一个Consumer只能属于属于一个Group。

 

 

示例图:


PartitionA-1、 PartitionA-2、PartitionA-1-R、PartitionA-2-R属于同一个TopicA,Partition的备份需要跨broker才有备份的意义,所以A-1和A-2的备份都在另一个Broker中。

TopciB的构造同TopicA。

GroupA有2个Consumer组成,订阅了TopicA;

GroupB也有2个Consumer组成,订阅了TopicA和TopicB;

GroupA和GroupB中组内只有一个Consumer能获取到订阅的Topic;

对于TopicA,PartitionA-1和PartitionA-2都可以为Consumer提供服务。

对于TopicA来说一旦Broker1宕机或掉电,Zookeeper会让Broke2中的2个备份转正继续提供服务,达到高可用性的目的。

误区:1、PartitionA-1、PartitionA-2中的内容是不一样,producer向topicA发消息,消息按照一定策略要么落到A-1要么落到A-2中,A-1-R和A-1中是一样的,因为这俩是备份的关系。正是因为这个设计正是Kafka伸缩性的由来,一旦发现Producer发TopciA太快,我们就添加一套PartitionA-3就好,让TopciA后续的消息有一定概率落到A-3中,提高存储能力。如果Consumer消费不够快还可以给Group添加Consumer。

2、Consumer消费的是Topic而不是Partition,例如GroupA中第一个consumer正在消费TopicA中的内容,先从PartitionA-1中pull回来1000条而且消费完毕,假如此时PartitionA-1中已经空了,而PartitionA-2中还有1000条消息,那consumer下次就会从A-2中再pull回来1000条消费,而不是等着A-1中有了内容再消费。

 

 

根据Kafka的设计再回头分析下它的优势:

1,持久化:虽然Kafka的持久化在一定程度上来说比较依赖磁盘的性能,但是Kafka中broker先缓存后入磁盘,永远只在尾巴追加,减少磁盘IO选道,只做“线性写”,不做“磁盘寻道”,简言之就是永远往前走不回头,而“磁盘寻道”的时间消耗是“线性写”的几万级别。

2,分布式:Kafka对硬件能力要求不高,廉价PC机就可以做到Partition的扩展,承载元数据管理的ZooKeeper的水平扩展也很容易。扩展的结果就是同一个Topic可以有N多个Partition,可以同时被更多的Producer和Consumer对接。

3,伸缩性:分布式是以Broker为维度来讲的,伸缩性是以Partition为维度来讲的,Topic下Partition的多少决定了Queue的性能。consumer端向broker发送"fetch"请求,并告知其获取消息的offset; consumer是个主动pull的动作,可以根据自己的能力决定什么时候去pull,pull多少回来。

4,高吞吐:不管消息是否被消费,都会保留在partition里,直到broker配置时间点进行清除,无论是否消费清除。Consumer每次来Partition读取都是批量拿走。简然之Kafka无论是消费、持久化、清理都是以块为单位而且是指针永远往前走不回头,而且可以通过压缩手段压榨CPU以提高速率。

 

 

Kafka的应用场景:

1,  日志收集

2,  活性跟踪

3,  消息系统

 

Kafka的docker启动:

docker run -p 9092:9092 -p 2181:2181 image

 

firewall-cmd --zone=public--add-port=2181/tcp --permanent

firewall-cmd--zone=public --add-port=2181/udp --permanent

firewall-cmd --zone=public--add-port=9092/tcp --permanent

firewall-cmd --zone=public--add-port=9092/udp --permanent

firewall-cmd --reload



原创粉丝点击