关于kafka:kafka全面理解

5次阅读

共计 2166 个字符,预计需要花费 6 分钟才能阅读完成。

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/…

正文完
 0