写在前面: 1.在开始coding前请仔细阅读以下内容
Apache RocketMQ作为的一款分布式的消息中间件,历年双十一承载了万亿级的消息流转,为业务方提供高性能低延迟的稳定可靠的消息服务。其中,实时读取写入数据和读取历史数据都是业务常见的存储访问场景,而且会在同一时刻同时出现,因此针对这个混合读写场景进行优化,可以极大的提升存储系统的稳定性。同时英特尔® 傲腾™ 持久内存作为一款与众不同的独立存储设备,可以缩小传统内存与存储之间的差距,有望给RocketMQ的性能再次飞跃提供一个支点。
实现一个单机存储引擎,提供以下接口来模拟消息的存储场景:
写接口
- long append(String topic, int queueId, ByteBuffer data)
- 写不定长的消息至某个 topic 下的某个队列,要求返回的offset必须有序
例子:按如下顺序写消息
{"topic":a,"queueId":1001, "data":2021}
{"topic":b,"queueId":1001, "data":2021}
{"topic":a,"queueId":1000, "data":2021}
{"topic":b,"queueId":1001, "data":2021}
返回结果如下:
0
0
0
1
读接口
-Map<Integer, ByteBuffer> getRange(String topic, int queueId, long offset, int fetchNum)
-返回的 Map<offset, bytebuffer> 中 offset 为消息在 Map 中的顺序偏移,从0开始
例子:
getRange(a, 1000, 1, 2)
Map{}
getRange(b, 1001, 0, 2)
Map{"0": "2021", "1": "2021"}
getRange(b, 1001, 1, 2)
Map{"0": "2021"}
评测环境中提供128G的傲腾持久内存,鼓励选手用其提高性能。
JAVA
仔细阅读demo项目中的MessageStore,DefaultMessageStoreImpl两个类。
你的coding目标是实现DefaultMessageStoreImpl
注: 日志请直接打印在控制台标准输出。评测程序会把控制台标准输出的内容搜集出来,供用户排错,但是请不要密集打印日志,单次评测,最多不能超过100M,超过会截断
1、 4核8G规格ECS,配置400G的ESSD PL1云盘(吞吐可达到350MiB/s),配置126G傲腾™持久内存。
2、 限制Java语言级别到Java 8。
3、 允许使用 llpl 库,预置到环境中,选手以provided方式引入。
4、 允许使用 log4j2 日志库,预置到环境中,选手以provided方式引入。
5、 不允许使用JNI和其它三方库。
评测程序会创建20~40个线程,每个线程随机若干个topic(topic总数<=100),每个topic有N个queueId(1 <= N <= 10,000),持续调用append接口进行写入;评测保证线程之间数据量大小相近(topic之间不保证),每个data的大小为100B-17KiB区间随机(伪随机数程度的随机),数据几乎不可压缩,需要写入总共150GiB的数据量。
保持刚才的写入压力,随机挑选50%的队列从当前最大点位开始读取,剩下的队列均从最小点位开始读取(即从头开始),再写入总共100GiB后停止全部写入,读取持续到没有数据,然后停止。
评测考察维度包括整个过程的耗时。超时为1800秒,超过则强制退出。
最终排行开始时会更换评测数据。
写入若干条数据。
重启ESC,并清空傲腾盘上的数据。
再读出来,必须严格等于之前写入的数据。
通过正确性评测的前提下,按照性能评测耗时,由耗时少到耗时多来排名。
我们会对排名靠前的代码进行review,如果发现大量拷贝别人的代码,将酌情扣减名次。
所有消息都应该进行按实际发送的信息进行存储,不可以压缩,不能伪造。
程序不能针对数据规律进行针对性优化, 所有优化必须符合随机数据的通用性。
如果发现有作弊行为,比如hack评测程序,绕过了必须的评测逻辑,则程序无效,且取消参赛资格。
在阿里天池找到"云原生编程挑战赛",并报名参加。
在code.aliyun.com注册一个账号,新建一个仓库,将大赛官方账号cloudnative-contest 添加为项目成员,权限为Reporter 。
fork或者拷贝mqrace2021仓库的代码到自己的仓库,并实现自己的逻辑;注意实现的代码必须放在指定package下,否则不会被包括在评测中。
在天池提交成绩的入口,提交自己的仓库git地址,等待评测结果。
及时保存日志文件,日志文件只保存1天。