本篇内容主要讲解“卡夫卡核心思想概括和底层原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“卡夫卡核心思想概括和底层原理”吧!
卡夫卡核心思想概括
所有的消息以“有序日志”的方式存储,生产者将消息发布到末端(可理解为追加),消费者从某个逻辑位按序读取。
【场景一】消息中间件
在选择消息中间件时,我们的主要关注点有:性能,消息的可靠性,顺序性。
1。性能
关于卡夫卡的高性能,主要是因为它在实现上利用了操作系统一些底层的优化技术,尽管作为写业务代码的程序员,这些底层知识也是需要了解的。
【优化一】零拷贝
这是卡夫卡在消费者端的优化,我们通过两张图来比较一下传统方式与零拷贝方式的区别:
传统方式:
- <李>
零拷贝方式:
李> <李>终极目标:如何让数据不经过用户空间?
李> <李>从图中可看的出,零拷贝省略了拷贝到用户缓冲的步骤,通过文件描述符,直接从内核空间将数据复制到网卡接口。
李>
【优化二】顺序写入磁盘
写入消息时,采用文件追加的方式,并且不允许修改已经写入的消息,于是写入磁盘的方式是顺序写入。我们通常认为的基于磁盘读写性能较差,指的是基于磁盘的随机读写;事实上,基于磁盘的顺序读写,性能接近于内存的随机读写,以下是性能对比图:
【优化三】内存映射
- <李>
概括:用户空间的一段内存区域映射到内核空间,这样,无论是内核空间或用户空间对这段内存区域的修改,都可以直接映射到另一个区域。
李> <李>优势:如果内核态和用户态存在大量的数据传输,效率是非常高的。
李> <李>为什么会提高效率:概括来讲,传统方式为阅读()系统调用,进行了两次数据拷贝;内存映射方式为mmap()系统调用,只进行一次数据拷贝
李>【优化四】批量压缩
- <李>
生产者:批量发送消息集消费者:主动拉取数据,同样采用批量拉取的方式
李>2。可靠性
卡夫卡的副本机制是保证其可靠性的核心。
关于副本机制,我将它理解为被领导机制,就是多个服务器中有相同数据的多个副本,并且划分的粒度是分区。很明显,这样的策略就有下面几个问题必须解决:
- <李>
各副本间如何同步?
李> <李>ISR机制:领袖动态维护一个ISR(同步副本)列表,
李> <李>领袖故障,如何选举新的领袖?
李> <李>要想解决这个问题,就要引出动物园管理员,它是卡夫卡实现副本机制的前提,关于它的原理且听下回分解,本篇还是从卡夫卡角度进行分析。在这里我们只需要了解,一些关于经纪人,话题,分区的元信息存储在动物园管理员中,领导人发生故障时,从ISR集合中进行选举新的领袖。
李>request.required。ack来设置数据的可靠性:
分区机制和副本机制知识点:
3。顺序性
顺序性保证主要依赖于分区机制+偏移量。
提到分区,首先就要解释一下相关的概念以及他们之间的关系,个人总结如下几点:
服务器(经纪人):指一个独立的服务器
主题(主题):消息的逻辑分类,可跨代理
分区(分区):消息的物理分类,基本的存储单元
这里盗一张图阐述上述概念间的关系
- <李>
为什么分区机制可以保证消息的顺序性?
李> <李>