复赛的题目要求设计一个单机百万队列以上的存储引擎,单机内存有限,需要充分利用数据结构与存储技术,最大化吞吐量。
校验程序分为三个阶段:
- 发送阶段: 消息大小在50字节左右,消息条数在20亿条左右,也即发送总数据在100G左右
- 索引校验阶段: 会对所有队列的索引进行随机校验;平均每个队列会校验1~2次
- 顺序消费阶段: 挑选10%的队列进行全部读取和校验
测试环境为4c8g的ECS,限定使用的最大JVM大小为4GB(-Xmx4g)。带一块300G左右大小的SSD磁盘。
SSD性能大致如下: iops 1w 左右;块读写能力(一次读写4K以上) 在200MB/s 左右。
注意关键词:50字节, 20亿条, 百万队列, SSD, Xmx4g
说实话,看到-Xmx4g
的时候就知道Java做这个的时候方案会非常受限
题目的关键点在于百万队列。任何常见的MQ方案在百万队列上可能都捉襟见肘。如果按照原先的RocketMQ的思路来解决这个问题,那么