西安开发网站的公司,一个旅游网站建设需求,网站设计职业工作室,家庭办厂3一8万项目批量发送消息
Kafka 采用了批量发送消息的方式#xff0c;通过将多条消息按照分区进行分组#xff0c;然后每次发送一个消息集合#xff0c;看似很平常的一个手段#xff0c;其实它大大提升了 Kafka 的吞吐量。 消息压缩
消息压缩的目的是为了进一步减少网络传输带宽。而…批量发送消息
Kafka 采用了批量发送消息的方式通过将多条消息按照分区进行分组然后每次发送一个消息集合看似很平常的一个手段其实它大大提升了 Kafka 的吞吐量。 消息压缩
消息压缩的目的是为了进一步减少网络传输带宽。而对于压缩算法来说通常是数据量越大压缩效果才会越好。
因为有了批量发送这个前期从而使得 Kafka 的消息压缩机制能真正发挥出它的威力。对比压缩单条消息同时对多条消息进行压缩能大幅减少数据量从而更大程度提高网络传输率。 多分区
Kafka 使用的是多分区策略消息被组织成一个一个的主题topic而主题可以划分为多个分区partition。每个分区都是一个有序、持久化的日志而 Kafka 通过分区来实现消息的水平扩展和负载均衡。
每个分区内的消息有一个唯一的偏移量offset消费者可以根据偏移量读取消息。一个主题可以有多个分区而消费者可以并行地消费不同分区的消息。 Kafka 使用分区的副本机制来实现数据的冗余备份而每个主题的分区可以配置多个副本其中一个副本为 leader领导者其他副本为 follower跟随者。所有写入操作都由 leader 处理而 follower 会定期从 leader 同步数据保持与 leader 数据的一致性。
当 leader 节点故障时Kafka 会自动从剩余的 follower 中选举新的 leader确保数据的可用性。 顺序写入
Kafka 的特性之一就是高吞吐率但是 Kafka 的消息是保存在磁盘上的一般认为在磁盘上读写数据是会降低性能的但是 Kafka 即使是普通的服务器Kafka 也可以轻松支持每秒百万级的写入请求超过了大部分的消息中间件这种特性也使得 Kafka 在日志处理等海量数据场景广泛应用。
Kafka 为防止丢失数据会把收到的消息都写入到硬盘中。为了优化写入速度 Kafka 采用了两个技术顺序写入和 MMFile。
因为硬盘是机械结构每次读写都会寻址-写入其中寻址是一个“机械动作”它是最耗时的。所以硬盘最讨厌随机I/O最喜欢顺序I/O。为了提高读写硬盘的速度Kafka就是使用顺序I/O。这样省去了大量的内存开销以及节省了IO寻址的时间。
即便是顺序写入硬盘硬盘的访问速度还是不可能追上内存。所以 Kafka 的写入性能也不可能和内存进行对比因此 Kafka 的数据并不是实时的写入硬盘中它充分利用了现代操作系统分页存储Page Cache来利用内存提高 I/O 效率。
Memory Mapped Files
Memory Mapped Files(MMAP或MMFile)也称内存映射文件在64位操作系统中一般可以表示20G的数据文件它的工作原理是直接利用操作系统的 Page 实现文件到物理内存的直接映射。完成 MMAP 映射后用户对内存的所有操作会被操作系统自动的刷新到磁盘上极大地降低了 IO 使用率。 常规的文件操作为了提高读写性能使用了 Page Cache 机制但是由于页缓存处在内核空间中不能被用户进程直接寻址所以读文件时还需要通过系统调用将页缓存中的数据再次拷贝到用户空间中。而采用 mmap 后它将磁盘文件与进程虚拟地址做了映射并不会招致系统调用以及额外的内存 copy 开销从而提高了文件读取效率。
Page Cache
虽然磁盘顺序写已经很快了但是对比内存顺序写仍然慢了几个数量级。Kafka 用到了 Page Cache 技术利用了操作系统本身的缓存技术在读写磁盘日志文件时其实操作的都是内存然后由操作系统决定什么时候将 Page Cache 里的数据真正刷入磁盘。 如果在极端的情况下会存在丢失数据的风险。 零拷贝
传统模式下当需要对一个文件进行传输的时候其具体流程细节如下 用户进程调用 read 系统调用向操作系统发出IO请求请求读取数据到自己的内存缓冲区中。自己进入阻塞状态。操作系统收到请求后进一步将IO请求发送磁盘。磁盘驱动器收到内核的IO请求把数据从磁盘读取到驱动器的缓冲中。此时不占用CPU。当驱动器的缓冲区被读满后向内核发起中断信号告知自己缓冲区已满。内核收到中断使用CPU时间将磁盘驱动器的缓存中的数据拷贝到内核缓冲区中。如果内核缓冲区的数据少于用户申请的读的数据重复步骤3跟步骤4直到内核缓冲区的数据足够多为止。将数据从内核缓冲区拷贝到用户缓冲区同时从系统调用中返回完成任务。
Kafka服务器在响应客户端读取的时候底层使用 ZeroCopy 技术直接将磁盘无需拷贝到用户空间而是直接将数据通过内核空间传递输出数据并没有抵达用户空间。