kafka全面了解

什么是音讯队列,它的益处是什么?

解藕

将音讯写入音讯队列,须要音讯的零碎本人从音讯队列中订阅,从而上游零碎不须要做任何批改

例如有上游零碎a,它有3个上游零碎b,c,d,为了使b,c,d能拿到a的数据,a须要在代码中去调用这3个零碎。如果有一天,b不再应用a的数据了或b的接口产生了变动,a还须要批改代码。而应用音讯队列,就只管往队列里发送数据,须要的上游本人去队列里取数据即可。

异步

不必同步期待上游将数据处理完,将音讯发到音讯队列中即可返回,不妨碍主流程。

例如上游零碎a是主业务,b,c,d是非次要业务,没有必要同步期待3个上游都返回主业务才持续。应用音讯队列能够实现异步,进步吞吐量。

削峰

上游数据有突发流量,上游可能扛不住,kafka在两头能够起到一个缓冲的作用,把音讯暂存在kafka中,上游服务就能够依照本人的节奏缓缓解决。

kafka概念

broker

broker是kafka实例。

replication

每一个partition有多正本,当主节点产生故障时,会抉择一个正本作为主节点。kafka是主写主读的。

topic

topic是音讯的分类,一个topic能够供任意多个生产组生产。

partition

topic的分区,每个topic的数据能够被分成多个partition,能够不在一个机器上,由此来实现kafka的伸缩性。各个partition的数据是不反复的,雷同partition的数据是依照发送程序有序的。任何partition只有一个leader,只有leader是对外提供服务的。leader接管到数据后,follower会不停给他发送申请尝试去拉取最新的数据,拉取到本人本地后,写入磁盘中。每个partition都有多个正本,雷同partition的各个正本散布在不同的broker上。

consumer group/consumer

一个consumer group是一个topic的订阅者,一个topic能够被多个consumer group订阅,各个consumer group是互相独立的。一个consumer group外部能够有多个consumer,多个consumer不会生产雷同的partition的音讯。最多无效的consumer数与partition数雷同,如果consumer数多于partition数,那么多进去的consumer不会生产到任何音讯。

rebalance

生产组内某个消费者挂掉后,其余消费者主动重新分配订阅topic的partition的过程。rebalance是消费者端实现高可用的重要伎俩。

kafka的个性

  • 高吞吐、低提早:kakfa 最大的特点就是收发音讯十分快,kafka 每秒能够解决几十万条音讯,它的最低提早只有几毫秒。
  • 高伸缩性: 每个主题(topic) 蕴含多个分区(partition),主题中的分区能够散布在不同的主机(broker)中。
  • 持久性、可靠性: Kafka 可能容许数据的长久化存储,音讯被长久化到磁盘,并反对数据备份避免数据失落,Kafka 底层的数据存储是基于 Zookeeper 存储的,Zookeeper 咱们晓得它的数据可能长久存储。
  • 容错性: 容许集群中的节点失败,某个节点宕机,Kafka 集群可能失常工作
  • 高并发: 反对数千个客户端同时读写

kafka为何快

页缓存+程序写入

kafka 写数据的时候,十分要害的一点,它是以磁盘程序写的形式来写的。仅仅将数据追加到文件的开端,不是在文件的随机地位来批改数据。
写入磁盘文件的时候,能够间接写入这个 OS Cache 里,也就是仅仅写入内存中,接下来由操作系统本人决定什么时候把 OS Cache 里的数据真的刷入磁盘文件中。

零拷贝

如果Kafka从磁盘中读取数据发送给上游的消费者,大略过程是:

  1. 先看看要读的数据在不在os cache中,如果不在的话就从磁盘文件里读取数据后放入os cache
  2. 从操作系统的os cache 里拷贝数据到应用程序过程的缓存里
  3. 从应用程序过程的缓存里拷贝数据到操作系统层面的Socket缓存里
  4. 从Soket缓存里提取数据后发送到网卡,最初发送进来给上游消费者

整个过程有两次没必要的拷贝

  1. 从操作系统的cache里拷贝到利用过程的缓存里
  2. 从应用程序缓存里拷贝回操作系统的Socket缓存里。

为了进行这两次拷贝,两头还产生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。
所以这种形式来读取数据是比拟耗费性能的

零拷贝

  1. 让操作系统的cache中的数据发送到网卡
  2. 网卡传出给上游的消费者

两头跳过了两次拷贝数据的步骤,Socket缓存中仅仅会拷贝一个描述符过来,不会拷贝数据到Socket缓存

另外:
从磁盘读数据的时候,会先看看os cache内存中是否有,如果有的话,其实读数据都是间接读内存的。
如果kafka集群通过良好的调优,大家会发现大量的数据都是间接写入os cache中,而后读数据的时候也是从os cache中读。
相当于是Kafka齐全基于内存提供数据的写和读了,所以这个整体性能会极其的高

消息压缩

批量发送

参考文章

https://juejin.im/post/684490...
https://juejin.im/post/684490...
https://zhuanlan.zhihu.com/p/...