首页 > 其他分享 >[消息队列]kafka高性能/高吞吐量

[消息队列]kafka高性能/高吞吐量

时间:2024-10-03 21:46:10浏览次数:9  
标签:缓存 队列 cache Kafka 高性能 磁盘 拷贝 kafka

Kafka每秒可以处理一百万条以上消息,吞吐量达到每秒百万级。那么Kafka为什么那么高的吞吐量呢?

简单来说有以下几点原因:

页缓存技术

Kafka是基于操作系统的页缓存来实现写入的。操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为 os cache,意思就是操作系统自己管理的缓存。Kafka在写入磁盘文件的时候,可以直接写入到这个os cache里,也就是仅仅写入到内存中,接下来由操作系统自己决定什么时候把os cache里的数据真的刷入磁盘文件中。这样可以很大提升写性能。

磁盘顺序写

Kafka写数据的时候,Kafka的消息是不断追加到文件末尾的,而不是在文件的随机位置写入数据,这个特性使Kafka可以充分利用磁盘的顺序读写性能。顺序读写不需要磁盘磁头的寻道时间,避免了随机磁盘寻址的浪费,只需很少的扇区旋转时间,所以速度远快于随机读写。

Kafka中每个分区是一个有序的,不可变的消息序列,新的消息不断追加到Partition的末尾,在Kafka中Partition只是一个逻辑概念,Kafka将Partition划分为多个Segment,每个Segment对应一个物理文件,Kafka对segment文件追加写,这就是顺序读写。

零拷贝

在消费数据的时候,实际上要从kafka的磁盘文件里读取某条数据然后发送给下游的消费者。Kafka在读数据的时候为了避免多余的数据拷贝,使用了零拷贝技术。也就是说直接让os cache里的数据发送到网卡后然后传输给下游的消费者,跳过中间从os cache拷贝到kafka 进程缓存和再拷贝到socket缓存中的两次缓存,同时也减少了上下文切换。在Linux Kernel2.2之后出现了一种叫做“零拷贝(zero-copy)”系统调用机制,就是跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户缓冲区”。Kafka 使用到了 mmap+write(持久化数据) 和 sendfile(发送数据) 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo。

参考博客:什么是零拷贝

分区并发

kafka中的topic中的内容可以分在多个分区(partition)存储,每个partition又分为多个段segment,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力

批量发送

Kafka允许进行批量发送消息,Productor发送消息的时候,可以将消息缓存在本地,等到了固定条件发送到kafka,可减少IO延迟
(1):等消息条数到固定条数
(2):一段时间发送一次

数据压缩

Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩,压缩的好处就是减少传输的数据量,减轻对网络传输的压力。批量发送和数据压缩一起使用,单条做数据压缩的话,效果不太明显。消息发送时默认不会压缩,可使用compression.type来指定压缩方式,可选的值为snappy、gzip和lz4

标签:缓存,队列,cache,Kafka,高性能,磁盘,拷贝,kafka
From: https://www.cnblogs.com/DCFV/p/18446041

相关文章

  • python3 队列的使用
    在leetcode如下题目中使用队列637.二叉树的层平均值:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolutio......
  • VisionTS:基于时间序列的图形构建高性能时间序列预测模型,利用图像信息进行时间序列预测
    构建预训练时间序列模型时面临的主要挑战是什么?获取高质量、多样化的时间序列数据。目前构建基础预测模型主要有两种方法:迁移学习LLM:通过针对时间序列任务定制的微调或分词策略,重新利用预训练的大型语言模型(LLM),如GPT-4或Llama。从零训练:构建大规模时间序列数据集,并从头开始预训......
  • 单调队列优化 DP
    单调队列可以\(O(n)\)求出子区间的最值,且顺序上要求区间的左端点和右端点单调不降。引入P1886滑动窗口/【模板】单调队列定义一个队列\(q\),我们让\(q\)中的元素满足单调不降。因此当\(x\)入队时,从前往后让不在当前范围的元素出队,从后往前将\(<x\)的元素全部出队,然......
  • 队列实现
    1、数组实现队列#include<stdio.h>#include<stdlib.h>#include<conio.h>#defineMAX10 /*定义队列的大小*/intmain(){ intfront,rear,val,queue[MAX]={0}; charchoice; front=rear=-1; while(rear<MAX-1&&choice!='e') { ......
  • 使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
    1、本文架构本文目标是使用微服务SpringCloud集成Kafka实现异步通信。其中KafkaServer部署在Ubuntu虚拟机上,微服务部署在Windows11系统上,KafkaProducer微服务和KafkaConsumer微服务分别注册到Eureka注册中心。KafkaProducer和KafkaConsumer之间通过KafkaServer实现异......
  • 【深入浅出MySQL】「性能调优」高性能查询优化MySQL的SQL语句编写
    总体优化大纲(1)优化查询性能:通过索引降低全表扫描频率提升数据库查询性能的途径时,一个关键的战略就是降低全表扫描的频次。因为全表扫描往往会消耗显著的计算资源,从而导致查询过程变得迟缓且效率低下,为了有效地提高查询的响应速度和整体性能。优化方向那些在where筛选条件和orderby......
  • 栈与队列相关知识(二)
    目录Java中栈(Stack)一.常用方法1.push(Eitem)2.pop()3.peek()4.empty()二.常用方法扩展1.search(Objecto)2.clone()3.contains(Objecto)4.size()5.toArray()Java中队列(Queue)一.常用方法(以LinkedList实现Queue为例)1.add(Ee)2.offer(Ee)3.remove()......
  • RabbitMQ死信队列和延迟队列(具体代码演示)
    先理解以下两点:1.延迟队列存储是延时消息,指当消息被发送以后,不让消费者立即拿到消息,而是等待指定时间后,消费者才能拿到消息进行消费。(队列设置过期时间对队列中所有消息生效,如果队列和消息都设置了消息过期时间,会取时间短的)2.入死信队列的三种情况:1.请求被拒绝的消息2.......
  • Leetcode:栈和队列的互相实现
    目录一、用两个队列实现栈题目:分析:代码实现: 二、用两个栈实现队列题目: 分析:代码:总结:核心就在于先进先出和后进先出之间的一个灵活变换,两个栈能够先进先出,而两个队列能够后进先出 一、用两个队列实现栈题目:.-力扣(LeetCode).-备战技术面试?力扣提供海量技术......
  • 1284 海港 队列 模拟
    思路解释 1. 数据结构选择: 使用 queue 来存储每艘船的到达时间和乘客国籍信息。 使用数组 a 来记录每个国籍的乘客数量。 2. 输入处理: 读取船只数量 n。 对于每艘船,读取其到达时间 t 和乘客数量 k,然后读取每个乘客的国籍 x。 3. 统计不同......