9

Kafka如何做到高并发读写

 2 years ago
source link: https://jiawea.github.io/2021/12/10/kafka/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Kafka如何做到高并发读写

发表于 2021-12-10

| 分类于 消息队列

Kafka是一个分布式流处理平台a distributed streaming platform。以发布订阅的模式来记录流数据,类似于消息队列或企业级消息系统。下面引用官方文档的描述:

A streaming platform has three key capabilities:

  1. Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.
  2. Store streams of records in a fault-tolerant durable way.
  3. Process streams of records as they occur.

如何实现快速读写

  1. 顺序写(page cache)

Kafka在对磁盘写数据时采用了顺序写,每个Partition(分区)其实就是一个log文件。Producer 向对应的分区以追加写的方式写入文件末尾。这种方式相比随机写入要快很多。

实际上Kafka的数据并不是直接写到磁盘的,操作系统本身有一层缓存 page cache,当程序往文件中写数据时,会先写到ByteBuffer中,然后再提交到page cache中,此时程序由内核态返回至用户态告知写入成功,后续由操作系统自己把page cache里的数据刷入磁盘中。

通过这种相当于写入内存的方式提高了I/O效率。

现代unix操作系统提供了一种优化方式,可以将page cache中的数据直接传输到socket中,在Linux中可以通过调用系统提供的sendfile来实现。如果使用传统的往磁盘读数据的方式,会经过这几步:

  1. 调用read(),操作系统从磁盘读取数据并写入内核态中的pagecache
  2. read()返回,应用程序将数据从内核态缓冲区拷贝至用户态缓冲区中。
  3. 调用write(),应用程序将数据从用户态缓冲区拷贝至内核态的套接字缓冲区中。
  4. 操作系统将数据从套接字缓冲区拷贝到NIC缓冲区(网卡),然后通过网络发送。

以上传统读取数据的步骤,需要进过4次拷贝操作,很显然会影响读取的速度。Kafka通过使用sendfile,操作系统可以将page cache中的数据直接拷贝到网卡中,从而避免了重复拷贝。提高了读取性能。

sendfile(socket, file, len);

Kafka之所以能够提供高并发的读取,主要是利用了磁盘的顺序写,并利用操作系统的page cache提高了磁盘I/O的效率;并运用了zore-copy技术,提升了整个系统的速度。

Kafka


Recommend

  • 77
    • www.linuxprobe.com 6 years ago
    • Cache

    Redis数据库如何实现读写分离

    Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。 下面用一个实例实现redis的读写分离,步骤如下: 第一步:下载redis 官网下载地址: http...

  • 35
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    如何使用MaxCompute Spark读写阿里云Hbase

    Spark on MaxCompute可以访问位于阿里云VPC内的实例(例如ECS、HBase、RDS),默认MaxCompute底层网络和外网是隔离的,Spark on MaxCompute提供了一种方案通过配置spark.hadoop.odps.cupid.vpc.domain.list来访问阿里云的vpc网络环...

  • 5

    Coder的技术之路20小时前JVM相关的异常,一直是一线研发比较头疼的问题。因为对于业务代码,JVM的运行基本算是黑盒,当异常发生时,较难直观的看到和找到问题...

  • 6

    打开聊天软件,跟重要的人说个早安,扫一眼关闭了提醒的群消息。相信这是很多人开始一天的“固定动作”。随着移动互联网和通信技术的高速发展,线上交流已成为人们工作、生活的最重要方式。没带手机出门就像失去了全世界,电量低于 50% 就开始焦虑,因为好...

  • 7

    最近很多交互要同原生的HttpServletRequest和HttpServletResponse打交道。从HttpServletRequest中读取body数据封装成某种数据结构;向HttpServletResponse写入数据并响应。传统的写法非...

  • 9

    无论是读取副本还是写入副本,都是通过底层的Partition对象完成的,而这些分区对象全部保存在上节课所学的allPartitions字段中。可以说,理解这些字段的用途,是后续我们探索副本管理器类功能的重要前提。 现在,我们就来学习下副本读写功能。整个

  • 3

    不同业务场景该如何选择缓存的读写策略?-51CTO.COM 不同业务场景该如何选择缓存的读写策略? 作者:冰河技术 2022-04-01 11:26:19 数据库

  • 6

    本文分享自华为云社区《MySQL高可用架构MHA+ProxySQL实现读写分...

  • 6

    V2EX  ›  macOS 如何回收微信 macOS 版本 xlog 读写权限  

  • 3

    这两天一直被这个sqlit3困扰,起因是项目中需要有这样一个中间,中间件承担着API角色和流量转发的角色,需要接收来自至少300个agent的请求数据,和健康检测的请求。 所以当即想到用go来实现,因为数据教训,不考虑使用pg大型数据库,所以就选择了轻量化的sqlite数据...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK