背景介绍
背景情况是这样:线上一个系统,在某次高峰期间MQ中间件故障的情况下,触发了降级机制,结果降级机制触发之后运行了一小会儿,突然系统就完全卡死,无法响应任何请求。
给大家简单介绍一下这个系统的整体架构,这个系统简单来说就是有一个非常核心的行为,就是往MQ里写入数据,但是这个往MQ里写入的数据是非常核心及关键的,绝对不容许有丢失。
所以最初就设计了一个降级机制,如果一旦MQ中间件故障,那么这个系统立马就会把核心数据写入本地磁盘文件。
但是如果说在高峰期并发量比较高的情况下,接收到一条数据立马同步写本地磁盘文件,这个性能绝对是极其差的,会导致系统自身的吞吐量瞬间大幅度下降,这个降级机制是绝对无法在生产环境运行的,因为自己就会被高并发请求压垮。
因此当时设计的时候,对降级机制进行了一番精心的设计。
我们的核心思路是一旦MQ中间件故障,触发降级机制之后,系统接收到一条请求不是立马写本地磁盘,而是采用内存双缓冲 + 批量刷磁盘的机制。
简单来说,系统接收到一条消息就会立马写内存缓冲,然后开启一个后台线程把内存缓冲的数据刷新到磁盘上去。
整个过程,大家看看下面的图,就知道了。
这个内存缓冲实际在设计的时候,分为了两个区域。
一个是current区域,用来供系统写入数据,另外一个是ready区域,用来供后台线程刷新数据到磁盘里去。
每一块内存区域设置的缓冲大小是512kb,系统接收到请求就写current缓冲区,但是current缓冲区总共就512kb的内存空间,因此一定会写满。
同样,大家结合下面的图,一起来看看。