关联比赛: 2021第二届云原生编程挑战赛1:针对冷热读写场景的RocketMQ存储系统设计
相逢
凌晨三四点,冒着严寒做着核酸
大家心事重重,表情凝重不堪
生活,是黑暗冰冷的荒原,乐观,如满天星河般绚烂
初冬的清晨,黄叶翩翩
快到来吧,那久违的笑脸
快过去吧,这该死的新冠
我吹过你吹过的风,这算不算相拥
我走过你走过的路,这叫不叫相逢
簇拥的人群,错位的时空
共享过的基站,沐浴过的霓虹
800米,或无所事事,或行色匆匆
10分钟,看天高云淡,却暗流涌动
时光流逝,网格纵横
不经意的交叉,在同一片天空
红黄绿码,万人同梦
看不见的坚强,有同一种感动
她叫成都,2500万的并发,心跳怦怦
这是中国,140M个对象,携手同工
疫无反顾,患难与共
天涯咫尺,云上相逢
一衣带水,原始见终
悸动
32岁,码农的倒数第二个本命年,平淡无奇的生活总觉得缺少了点什么;
想要去创业,却害怕家庭承受不住再次失败的挫折,想要生二胎,带娃的压力让我想着还不如去创业;所以我只好在生活中寻找一些小感动,去看一些老掉牙的电影,然后把自己感动得稀里哗啦,去翻一些泛黄的书籍,在回忆里寻找一丝丝曾经的深情满满;去学习一些冷门的知识,最后把自己搞得晕头转向,去参加一些有意思的比赛,捡起那10年走来,早已被刻在基因里的悸动;
那是夏末的一个傍晚,我和同事正闲聊着西湖的美好,他们说想去瞧瞧,我便说阿里有免费的机票,他们问是否可靠,我说:阿里挺可靠,不过我只有九成的把握,另外一成层得找我媳妇儿要;那一天,Ninety Percent战队应运而生,云原生MQ的赛道上,又多了一个艰难却坚强的选手;
人到中年,仍然会做出一些冲动的决定,那种屁股决定脑袋的做法,像极了领导们的睿智和18岁时我朝三暮四的日子;夏季的ADB比赛,已经让我和女儿有些疏远,让老婆对我有些成见;此次MQ一战,必然是要暗度陈仓,卧薪尝胆,不到关键时刻,不能让家里人知道我又在卖肝;
开工
你还别说,或许是人类的本性使然,这种背着老婆偷偷干坏事情的感觉还真不错,从上路到上分,一路顺风顺水,极速狂奔;断断续续花了大概两天的时间,成功地在A榜拿下了first blood;再一次把第一名和最后一名同时纳入囊中;快男总是不会让大家失望了,800秒的成绩,成为了比赛的base line;
第一个版本并没有做什么设计,基本上就是拍脑门的方案,目的就是把流程跑通,尽快出分,然后在保证正确性的前提下,逐步去优化方案,避免一开始就过度设计,导致迟迟不能出分,影响士气;
整体设计
当append方法被调用时,会将传入的相关参数包装成一个Request对象,put到请求队列中,然后当前线程进入等待状态;
聚合线程会循环从请求队列里面消费Request对象,放入一个列表中,当列表长度到达一定数量时,就将该列表放入到聚合队列中;这样在后续的刷盘线程中,列表中的多个请求,就能进行一次性刷盘了,增大刷盘的数据块的大小,提升刷盘速度;当刷盘线程处理完一个请求列表的持久化逻辑之后,会依次对列表中个各个请求进行唤醒操作,使等待的测评线程进行返回;
内存级别的元数据结构设计
<![endif]--> 首先用一个二维数组来存储各个topicId+queueId对应的DataMeta对象,DataMeta对象里面有一个MetaItem的列表,每一个MetaItem代表的一条消息,里面包含了消息所在的文件下标、文件位置、数据长度、以及缓存位置
SSD上数据的存储结构
总共使用了15个byte来存储消息的元数据,消息的实际数据和元数据放在一起,这种混合存储的方式虽然看起来不太优雅,但比起独立存储,可以减少一半的force操作;