「轻阅读」消息中间件如何实现每秒几十万的高并发写入?

一壶清酒 2019-07-03 08:25:48 ⋅ 972 阅读



前言

用过消息中间件的都知道能够解决业务中的性能瓶颈,那么消息中间件如何实现每秒几十万的高并发写入?

消息中间件存储

首先理解一点,消息中间件一般都是存储在磁盘上的,大家都知道直接在磁盘读写是有性能瓶颈的,不可能达到每秒几十万的吞吐量,那么消息中间件是怎么保证读写性能的呢?

写数据

1、消息中间件是基于操作系统的页缓存来实现文件写入的。操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为os cache,意思就是操作系统自己管理的缓存。

我们在写入磁盘文件的时候,可以直接写入这个os cache里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把os cache里的数据真的刷入磁盘文件中。也就是说我们写是挨个写入缓存中,系统批量写入磁盘。

2、写磁盘文件并不是随机添加的,而是在文件末尾追加的,这也就保证了消息在单个磁盘文件的顺序性(多分区就不能保证顺序了)。

读数据

1、消息中间件读数据也是从os cache中读取的,如果os cache中没有,系统会去磁盘中批量读取一部分数据,放入os cache中。

2、消息中间件用到一种叫做零拷贝的技术。

一般我们完成一次网络传输拷贝,需要以下几步:

1)调用read系统接口,将数据从磁盘文件拷贝到读内核缓冲区。

2)从读内核缓冲区拷贝到用户空间缓存;

3)调用write系统接口,将数据从用户空间拷贝到写内核空间缓冲区。

4)将数据从内核空间缓冲区拷贝到socket缓存冲,准备网络传输。

上面我们可以看出,一共进行了四次数据拷贝。使用零拷贝技术,我们调用mmap接口,在用户空间和内核空间共享一段内存。这样我们就只需要两次拷贝。

1)将磁盘文件数据拷贝到mmap共享内存区。

2)将数据从mmap共享内存区拷贝到socket缓存区。

这样我们就减少了一半的数据拷贝,缩短时间。



全部评论: 0

    我有话说:

    “12306”是如何支撑百QPS

    作者:绘你一世倾城链接:https://juejin.im/post/5d84e21f6fb9a06ac8248149 到节假日期间,一二线城市返乡、外出游玩人们几乎都面临着一个问题:抢火车票

    Nginx服务器高性能优化--轻松实现10并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础内容,大家可以去这里看看

    阅读如何构建可伸缩Web应用?

    可伸缩性已经成为Web应用程序DNA!

    阅读」大众点评是如何分表分库

    原大众点评订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想

    阅读消息总线(MQ)知多少

    消息总线(Message Queue,MQ),是一种跨进程通信机制,用于在上下游之间传递消息。MQ是一种常见上下游“逻辑解耦+物理解耦”消息通信服务,消息发送上游只需要依赖MQ,逻辑上和物理上

    阅读如何设计移动端屏适配方案

    在众多移动设备中,前端开发人员如何在不同屏幕大小,不同程度清屏下去百分百还原设计稿,从来都不

    京东技术:如何实现TPS?详解JMQ4存储设计

    JMQ是京东中间团队自研消息中间,诞生于2014年,服务京东近个应用,2018年11.11大促期间峰值流量超过5000亿条消息

    阅读」推荐系统中信息增强小技巧

    实用推荐系统构建经验,如何进行信息增强。

    「免费」千级电商并发实战

    IT老齐 16年Java研发与架构设计经验、前京东金融架构师、中国财政部数据平台架构师、专注送给小白实战课、只为高薪而生、重实战,说人话,讲干货,不扯淡!

    阅读」Dubbo 如何成为连接异构微服务体系最佳服务开发框架

    实现异构微服务体系间共存或迁移,关键点在打通异构体系间协议与服务发现,得益于 Dubbo 自身对多协议、多注册模型支持

    阅读」从MySQL可用架构看可用架构设计

    可用HA(High Availability)是分布式系统架构设计中必须考虑因素之一

    阅读」移动端事件穿透原理与解决方案

    本文将带你了解事件穿透及如何实际项目中选择合适方案解决事件穿透问题。

    大数据量下 MyBatis PageHelper 分页查询性能问题解决办法

    前因 项目一直使用是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题。随着业务扩增,数据库扩增PageHelper出现了明显性能问题。 甚至上百单表数据查询性能缓慢

    阅读」美团开源QPS压测结果近5w/s分布式ID生成器leaf调试实战

    大型互联网项目ID要保证全局唯一,一般不在用数据库自带id自增了,一般都会用分布式id生成器。