消息引擎四大设计特征:
一:kafka高吞吐量低延迟
kafka写入操作比较快,kafka把数据写入到操作系统页缓存中(页缓存是在内存中分配,操作系统自行决定何时把数据写回磁盘)典型的磁盘顺序访问型操作 (避免了磁盘随机写操作 ),轻松做到每秒写入几万甚至几十万消息
消费端做到高吞吐低延时: 首先从os的页缓存中读取,命中页缓存(不用穿透到底层的物理磁盘来获取消息)将数据直接发送到socker(零拷贝技术)linux的sendfile系统来实现零拷贝
实际上,kafka集群磁盘的读操作很少,大部分的消息都是直接命中页缓存
kafka实现高吞吐量和低延迟依靠以下几点:
1:大量使用页缓存 内存操作速度快且命中高
2:不直接参与物理I/O,交给最擅长此事的操作系统
3: 采用追加写入,避免缓慢的磁盘随机读/写操作
4:sendFile为代表的零拷贝加强网络间的数据传输效率
二:kafka消息持久化(高可用)
kafka服务通过持久化消息,解耦消息发送和消息消费
直接持久化数据到磁盘,留出内存给页缓存,提升整体性能
三:负载均衡(高吞吐)和故障转移(高可用)
负载均衡:智能化分区领导者选举(partition leader election)算法
故障转移:kafka集群以会话形式注册到zk,会话超时或者主备份无法维持心跳,集群自动启动备份服务器(选举出新的leader)
四:伸缩性
kafka集群中每台服务器的内部状态交给zk维护,扩展集群只需启动新的kafka服务器(kafka服务器只需保存轻量级状态)
基本概念:消息
topic------------》partition(一个topic上多个partition)------------》replica(一个partition多个备份replica)
消息:消息头 +key+ value
key:消息键 对消息做partition作用,决定消息被保存在topic下的哪个partition
在JMM中对象保存开销相当大,小对象通常需要两倍空间保存数据,并且堆数据量增大 GC性能下降 拖慢系统吞吐量 ; 运行java的操作系统通常默认开启页缓存 数据存两份,资源两份 故kafka使用紧凑二进制字节数组ByteBuffer(key value)
topic:逻辑概念 代表一类消息 用于区分业务 社区团购,买家秀
partiton :topic下有很多分区 默认从partiton 0开始,每个分区上有很多offset 从0开始并递增,每个offset对应一个消息(每条消息在partition上的位移是固定的,但消费者的消费offset随着消费进度前移)
消息三元组:topic partition offset 通过三元组能在kafka集群中找到唯一对应的消息
replica:副本 备份partition有序消息日志
副本分类:leader副本 、 follower副本
kafka保证同一个partition的多个replica一定不会分配在一个broker上 否则无法实现备份的效果
kafka应用场景:
消息传输
网站行为日志追踪(支持用户超大的点击流量 超强的吞吐量)
审计数据收集(可持久化)
日志收集(低延时,全量收集,HDFS)