https://blog.csdn.net/autoliuweijie/article/details/52230165
首页 | 归档 | 分类 | 标签 | 关于 |
|
kafka 所有的请求都是通过TCP网络以Socket 的方式进行通讯的,使用的Reactor模式
1 | Broker端参数 num.network.threads:网络线程池的数量,默认值是3。表示每台Broker启动时会创建3个网络线程,专门处理客户端发送的请求 |
控制类请求和数据类请求分离
副本机制的好处
1 | 1. 提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性 |
kafka的副本机制
1 | 目前kafka只 "提供数据冗余" 实现高可用性和高持久性 |
Broker 端参数
1 | log.dirs: 指定Broker需要使用的若干个文件目录路径 |
注意:kafka于 2.8 版本放弃 zookeeper,该版本将依赖于 zookeeper 的控制器改造成了基于 kafka Raft 的 Quorm 控制器
在基于 kafka 的分布式消息队列中,zookeeper 的作用有:broker 注册、topic 注册、producer 和 consumer 负载均衡、维护 partition 与 consumer 的关系、记录消息消费的进度以及 consumer 注册等
/brokers/ids/{broker.id}
磁盘顺序读写
使用磁盘的顺序读写,一般来说要高出磁盘随机读写三个数量级,一些情况下磁盘顺序读写性能甚至高于内存随机读写
kafka的message是不断追加到本地磁盘文件末尾的
每一个partition是一个文件,收到消息后kafka会把数据插入到文件末尾,但是没有办法删除数据,因此kakfka是不会删除数据的
如何删除数据:1. 基于时间 2. 基于 partition 文件大小
Page Cache
为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存。
避免Object消耗:如果是使用 Java 堆,Java对象的内存消耗比较大,通常是所存储数据的两倍甚至更多。
避免GC问题:随着JVM中数据不断增多,垃圾回收将会变得复杂与缓慢,使用系统缓存就不会存在GC问题
相比于使用JVM或in-memory cache等数据结构,利用操作系统的Page Cache更加简单可靠。首先,操作系统层面的缓存利用率会更高,因为存储的都是紧凑的字节结构而不是独立的对象。其次,操作系统本身也对于Page Cache做了大量优化,提供了 write-behind、read-ahead以及flush等多种机制。再者,即使服务进程重启,系统缓存依然不会消失,避免了in-process cache重建缓存的过程。
通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。
consumer设计原理
1 | kafka consumer:用户主线程、心跳线程 |
定制两套多线程方案
1 | 1. 消费者程序启动多个线程,每个线程维护专属的 KafkaConsumer 实例,负责完整的消息获取、消息处理流程 |