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从磁盘中读取数据发送给上游的消费者,大略过程是:
- 先看看要读的数据在不在os cache中,如果不在的话就从磁盘文件里读取数据后放入os cache
- 从操作系统的os cache 里拷贝数据到应用程序过程的缓存里
- 从应用程序过程的缓存里拷贝数据到操作系统层面的Socket缓存里
- 从Soket缓存里提取数据后发送到网卡,最初发送进来给上游消费者
整个过程有两次没必要的拷贝
- 从操作系统的cache里拷贝到利用过程的缓存里
- 从应用程序缓存里拷贝回操作系统的Socket缓存里。
为了进行这两次拷贝,两头还产生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。
所以这种形式来读取数据是比拟耗费性能的
零拷贝
- 让操作系统的cache中的数据发送到网卡
- 网卡传出给上游的消费者
两头跳过了两次拷贝数据的步骤,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/...