抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Kafka最初是有Linkedin公司研发的,是一个分布式流处理系统,流处理系统提供了推送消息和订阅消息功能,分布式提供了高容错、并发处理消息机制。

Kafka作为一个热门的消息队列中间件,具有高效可靠的异步消息传递机制,应用场景很多

  1. 日志处理与分析

  2. 推荐数据流

  3. 系统监控预警告

  4. CDC(数据变更捕获)

  5. 系统迁移

  6. 事件追溯

  7. 消息队列

kafka

系统架构

整体简单说就是生产者发送消息给kafka,消费者拉取消息。

消息推送

不过kafka对于这三端做了很多高可用的方案,来提升并发量。下面先介绍下Kafka中各个组件:

  • Producer: 生产者,用于发送消息到Kafka服务端

Broker:Kafka消息服务端,多个Broker组成Kafka服务端集群。每个Broker中会有一个或N个partition。

  • Topic:消息主题,一个主题就是一组消息的队列,这个消息队列保存这一类型的消息,topic中实际有一个或N个Pratition,实际消息是存储在一个Topic下Partition中。一个Topic如果有多个Partition,则消息是无序的,如果一个Topic下只有一个Partition,则消息是有序的,因为一个Partition中的消息是有序的。

  • Partition:是Topic在物理上的分片。一个Topic可以有多个Partition,每个Partition内的消息是有序的队列。Partition可以有副本(Replica)来保证高可用性。

  • Consumer:消费者,负责从Kafka中拉取消息。

  • Consumer Group:消费组,多个Consumer使用同一个ConsumerID称之为一个消费组,每条消息只能被Consumer Group中一个Consumer消费,但可以被多个Consumer Group消费。

  • Replica:Partition的副本,用来保证高可用性,提高容灾能力。每个Partition的副本会均匀的分不到不同的Broker上。如果Partition副本的Leader出现问题,则会从其他的副本中选举出新的副本作为Leader。

  • Controller:Kafka集群中的单独一台服务器,主要负责处理Parition的Leader出现异常后,选举新的副本为Leader。

  • Zookeeper:管理Kafka的Broker注册等各个组件的信息。

基于上面各个组件,得出下面这张图

系统

高性能

Kafka的高性能不仅仅因为架构的分布式,还有消息批量发送、IO顺序读写、PageCache加速消息读写、零拷贝技术等。

批量消息提升数据处理能力

Kafka内部消息都是一“批”为单位处理,当kafka客户端实现消息发送时,采用的时异步批量发送机制。

当我们调用send() 发送消息时,不管是同步还是异步,都不会立刻将消息发出,Kafka会将消息先保存在内存中,等到合适的时机批量发送给Broker。

在Broker中,整个处理流程同样是义“批”单位处理,无论是写入磁盘,从磁盘读取,复制到其他磁盘,

在Consumer读取消息也是同样以“批”进行传递的,Consumer客户端从Broker获取到一批数据后,再拆分成一条条交由用户代码处理。

顺序读写提升IO读写能力

对于磁盘来说,顺序读取远比随机读取性能要高。

kafka也是利用了磁盘整个特性,对于每个分区,从Producer获取消息后,顺序的写入磁盘log文件,如果某个log文件写满了,则创建新的log文件继续写,读取的时候也是按照分区的log文件顺序读取。

PageCache加速消息读取

计算机文件读取和写入不会直接操作磁盘,中间会有一层PageCache缓存,是OS对文件的缓存,用于加速对文件的读写,当读取是PageCache中没有则会从磁盘中读取,否则直接从PageCache中读取,然后再加载到PageCache中,下次就能直接从PageCache中回去到。

PageCache减少了文件的I/O操作,提高了性能。

零拷贝

零拷贝就是从PageCache将数据直接读到Broker的Socket的Buffer中,在通过网络传输。中间不需要经过程序处理。减少磁盘I/O

延迟消费

Kafka本身不支持延迟消息,通过Kafka Streams实现

评论