天天看点

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

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

前言

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

消息中间件存储

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

写数据

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缓存区。

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

继续阅读