/queue-race

第四届阿里中间件性能挑战赛复赛——单机可支持100万队列的消息队列引擎

Primary LanguageJava

1. 题目背景

Apache RocketMQ 作为的一款分布式的消息中间件,历年双十一承载了万亿级的消息流转,为业务方提供高性能低延迟的稳定可靠的消息服务。随着业务的逐步发展和云上的输出,单机队列数量的逐步增加,给 RocketMQ 带来了新的挑战。复赛的题目要求设计一个单机百万队列以上的存储引擎,单机内存有限,需要充分利用数据结构与存储技术,最大化吞吐量。

2. 题目描述

实现一个进程内的队列引擎,单机可支持100万队列以上。

3. 程序目标

重写 DefaultQueueStoreImpl,并实现以下接口:
abstract void put(String queueName, String message);
abstract Collection get(String queueName, long offset, long num);

4. 测试环境描述

测试环境为 4c8g 的 ECS,限定使用的最大 JVM 大小为 4GB(-Xmx4g)。带一块 300G 左右大小的SSD磁盘。

SSD 性能大致如下:iops 1w 左右;块读写能力(一次读写 4K 以上)在 200MB/s 左右。

5. 程序校验逻辑

校验程序分为三个阶段:

1.发送阶段 2.索引校验阶段 3.顺序消费阶段

程序校验规模说明:

1.各个阶段线程数在 20-30 左右 2.发送阶段:消息大小在 50 字节左右,消息条数在 20 亿条左右,也即发送总数据在 100G 左右 3.索引校验阶段:会对所有队列的索引进行随机校验;平均每个队列会校验 1-2 次; 4.顺序消费阶段:挑选 20% 的队列进行全部读取和校验; 5.发送阶段最大耗时不能超过 1800s;索引校验阶段和顺序消费阶段加在一起,最大耗时也不能超过 1800s;超时会被判断为评测失败。