前言

Apache Kafka 最早是由 LinkedIn 开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。尤其是做日志中间件。

  • Kafka是一个分布式系统,具备高扩展高吞吐高性能的特性.
  • Kafka的单机吞吐量可达十万级别,时效性是ms级别。对比ActiveMQ吞吐量猜到万级别。在集群维度下,随着topic数量增多,分区数量增多,可以自由往上扩展吞吐,可达百万级别。
  • kafka的消息可靠性,经过参数优化配置,可以做到 0 丢失。

背景

我们公司迁移ActiveMQ消息中间件,为了减少资源开支,引入Kafka这种高性能高吞吐高并发的消息组件,相同的数据消息,kafka所需要的的资源开支更少,性能更高,减少公司的开支。

知识准备

  • broker

即代表的一个kafka的server服务器,一个topic主题下可以在多个broker存在,只不过是一个是主的,其他是从的。

  • Topic

Topic是kafka用于存储消息的逻辑概念,可以看出是一个消息集合。每个Topic可以有多个生产者向其中推送消息,也可以有任意多个消费者消费其中的消息。

  • Partition分区

每个Topic都有多个分区,每个Rartition分区所存储的消息都是不同的,类似数据的水平切分的思想,可以提高并发读写的能力。

  • 消费组consumer group / 消费者 consumer

每个消费者都会绑定一个消费者组,一个分区的某一个消息只能由消费组下的某一个消费者消费,但是这个分区下的所有消息会均匀的被消费组的消费者消费。
如果每个消费者都绑定不同的消费组,那么就实现了订阅的模式,分区下的每一个消息都会被广播到所有消费者。

  • Queue

ActiveMQ等消息中间件的消息概念,是队列的意思。在这个队列的消息只能被一个消费者消费一次。

kafka基础

总所周知,kafka的性能是高于业界其他的消息中间件,并且集开源,社区活跃的众多优点。但是我们有没有想到为什么kafka的性能会这么高,他与其他消息中间件有什么区别,使用了其他中间件那些没有的技术。
答案就是 1. 顺序读写方式 2. MMfile技术 3. 零拷贝技术

顺序读写

对比其他的消息中间件,例如ActiveMQ消息中间件,他对于写数据就是随机写入磁盘,然后读取时也是精准查找。但是因为大量的IO寻址操作耗费大量的时间,所以kafka在这点上进行优化处理,采用顺序读写,将生产者发送的数据存储到partition中的文件里,以此实现顺序写入,而消费者因为自带offset,可以接着上次的读写位置继续读取消息,从而实现顺序读。想对于其他消息中间件减少了大量的IO寻址时间,据网上查询顺序读写速度可达到400M/s,而随机读写慢的话可以达到几百K/s。

kafka原理 kafka原理 性能_消息中间件

MMfile技术

MMfile就是Memory Mapped file内存映射文件,是现在操作系统的分页存储系统,简单来说就是讲磁盘上的文件映射到内存上pagecache中,kafka向文件中写数据时,会直接向内存中PageCache中去写,然后操作系统自动刷新到硬盘上,极大降低IO的使用效率,但是这个技术有个问题一旦断电就会丢失消息。(这个丢失数据只是针对单个kafka的数据,但是因为kafka集群有一定的消息存储策略,消息可以做到不会丢失)

kafka原理 kafka原理 性能_kafka原理_02

零拷贝技术

假如消费者向kafka的分区leader去拉去消息,传统的数据传输就是

  1. 第一步将数据从磁盘中找到,拷贝到内核态的缓存中。
  2. 第二步将内核态的缓存再次拷贝到用户态的内存中。
  3. 第三部将用户态的内存数据拷贝到内核态的socket buffer中,再由网络传输到达消费者。

kafka采用零拷贝技术,所谓的零拷贝也不是真正意义上的不拷贝,只是减少拷贝的次数,提高传输效率。

  1. 第一步将数据从磁盘中找到,拷贝到内核态的缓存中。
  2. 第二步将用内核态的缓存数据拷贝到内核态的socket buffer中,再由网络传输到达消费者。
    这样就减少一次拷贝次数,提高传输效率。

以上都是单机下的性能优势。


kafka集群有什么优势之处,可以提高kafka的吞吐量呢?

上面有提到kafka有别于ActiveMQ消息中间件的消息逻辑概念。他只有topic主题概念。但是因为和ActiveMQ的架构概念不同,导致二者集群对外提供服务的上限不同。
ActiveMQ集群架构可以有简单的Master-Slave架构,这个就是很简单,Master机器对外提供服务,Slave机器作为灾备机器,一旦Master出现宕机,Slave继续对外提供服务,但是这样的话整个集群对外提供服务的能力就集中在Master机器上。
ActiveMQ集群架构可以Networks of Brokers架构,当某一个broker出现积压的消息时,会转移到另一一个broker服务,从来是整个系统对外提供服务提高一部分。

但是相对于kafka来说,他从内部架构逻辑上已经考虑到大数据量的问题,它有topic--broker--partition-consumer概念,来创造一个可扩展,高吞吐的一个对外提供服务的消息组件。
上面kafka只有topic这一种消息逻辑结构,一个topic下有多个分区partition,每个分区存储不同的数据,而这些分区有均匀分布在多个broker之间.
kafka生产者会发送消息给topic下的partiton leader,消费者也会向partition leader拉去消息。理论上我们只有增多我们broker服务,建立更多的partiton分区,我们就可以对外提供更高的吞吐服务。

kafka原理 kafka原理 性能_消息中间件_03