第三届阿里中间件性能挑战赛初赛-答辩资料学习

题目

题目内容

Topic类似于水坝(蓄积功能,消峰填谷之利器),Queue类似于水渠;每当新建一个Queue的时候,可以选择绑定到几个Topic,类似于水渠从水坝引水; 每个Topic可以被任意多个Queue绑定,这点与现实生活不太一样,因为数据可以多次拷贝; 在发送的时候,可以选择发送到Topic,也可以选择直接发送到Queue;直接发送到Queue的数据只能被对应Queue消费,不能被其他Queue读取到; 在消费的时候,除了要读取绑定的Topic的数据,还要去取直接发送到该Queue的数据。

程序目标

实现以下接口:

  • Producer的createBytesMessageToTopic(topic, body)
  • Producer的createBytesMessageToQueue(queue, body)
  • Producer的send(message)
  • PullConsumer的attachQueue(queue, topics)
  • PullConsumer的poll()
程序校验逻辑
  1. 10~20个线程(位于同一进程中)各自独立调用Producer发送消息(每个线程启动一个Producer,每条消息随机发送到某个Topic或者Queue),持续时间T1,请注意把消息数据写入磁盘中
  2. 强行kill Producer进程,未写入磁盘的消息都会丢失
  3. 10~20个线程(位于同一进程中)独立调用Consumer收取消息(每个线程启动一个Consumer,attach到指定的Queue,不同的Consumer不会attach同一个Queue),验证消息顺序准确性,可靠性,消费持续的时间为T2,消费到的总消息数目为N
  4. 以N/(t1+t2)来衡量性能
补充说明
  1. 测试时,topic和queue的数目大约是100个(其中queue的数目与消费者线程数相等);
  2. 测试时,消息大小不会超过256K;
  3. 可靠性是指,消息不能丢失,且消息的内容不能被篡改;在测试消费的时候,会对消息的body,headers,properties的内容进行校验;
  4. header与properties中key和value都不会插入null或空值;
  5. 仅允许依赖JavaSE8包含的lib;
消息顺序的说明
  1. 顺序只针对单个topic或者queue,不同topic,不同queue,topic与queue之间都不用考虑顺序;
  2. 消息产品的一个重要特性是顺序保证,也就是消息消费的顺序要与发送的时间顺序保持一致;
  3. 在多发送端的情况下,保证全局顺序代价比较大,只要求各个发送端的顺序有保障即可; 举个例子P1发送M11,M12,M13,P2发送M21,M22,M23,在消费的时候,只要求保证M11,M12,M13(M21,M22,M23)的顺序,也就是说实际消费顺序为M11,M21,M12,M13,M22,M23 正确,M11,M21,M22,M12,M13,M23 正确,M11,M13,M21,M22,M23,M12 错误,M12与M13的顺序颠倒了;

题目解读

  1. 题目要求实现五个接口,分别对应于Producer生产消息、发送消息,Consumer绑定topic和queue、消费消息;
  2. topic可以存储数据,queue也可以存储数据;
  3. Producer可以把消息发送到任意的topic和queue中,但是一条消息只能发送到一个topic或queue中;
  4. Consumer和queue数量相等,两者一一对应,一个Consumer绑定一个queue和多个topic,不同的Consumer绑定不同的queue,topic可以相同;
  5. Consumer消费数据时,只保证对应Producer局部有序,即Consumer消费某topic/queue的消息时,来自同一Producer的数据其接收顺序与发送顺序相同;

答辩资料解读

初赛第六名代码链接(本人非作者):

https://github.com/whutjs/MessageSystem

生产者架构
生产者架构图
  1. 每个生产者对应一个输出文件;
  2. 生产者每生产一条消息,就把消息编码后写入ByteBuffer中,再把ByteBuffer中二进制数据写入对应topic或queue的Cache中,然后清空ByteBuffer;
  3. 当topic/queue对应的Cache存满后,就把这个Cache中所有二进制数据写到输出文件对应的ByteBuffer中;
  4. 写入ByteBuffer时依次写入topic/queue的编号、数据长度的类型、数据长度和多条消息的二进制数据;
  5. ByteBuffer存满后就把数据刷到输出文件中;
消费者架构
消费者架构图
  1. 一个文件对应一个FileReadCache,一个消费者对应一个FileReadCache;
  2. 每个消费者拥有一个ConcurrentLinkedQueue,调用poll()方法读取消息;
  3. 若queue中没有消息,且对应的FileReadCache没有读完,则通过FileReadCache解码出一条消息,然后MessageLoader把消息分发到订阅了此topic/queue的Consumer的queue中;
  4. 若queue中没有消息,且对应的FileReadCache已经读完,则降低该消费者线程的优先级,这样其它Consumer就会多占用CPU来解码消息,并把该消费者需要的消息发过来,存到queue中;
  5. 所有的FileReadCache都把对应的文件读完了,MessageLoader发送endMsg到所有Consumer的queue中,这样所有Consumer就消费结束;
消息存储结构
消息存储结构
  1. 每个Producer对应一个输出文件,文件中存储二进制数据;
  2. 文件中数据的结构:topic/queue的编号、数据长度的类型、数据长度、多条消息的二进制数据,然后是下一个topic/queue的数据;
  3. 消息的结构:消息头标识、消息id的长度、消息id的二进制数据、key的长度、key的二进制数据、val的长度、val的二进制数据、消息体开头标识、消息体的长度、消息体的二进制数据,然后是下一条消息的数据;
如何解码二进制数据
  1. 因为文件是追加写入的,因此最开始的消息写在文件的最前面;
  2. 读取数据时,把当前topic/queue对应的整块Cache数据加载到ByteBuffer中,一次解析出一条消息,再把该消息push给订阅了该topic/queue的Consumer;
  3. 当前topic/queue的消息被解析完后,再加载下一个topic/queue对应的Cache数据;
如何保证数据的有序性

有序性示例

图中producer1发送3条数据给topic1、2条数据给topic2,consumer1订阅了topic1和topic2;需保证consumer1中来自topic1的3条数据其顺序与其在producer1中相同,来自topic2的2条数据其顺序与其在producer1相同,来自不同topic的数据没有顺序要求;
原理:File中消息的顺序与Producer一致,FileReadCache从前往后依次解析File中的消息,然后把消息push给Consumer,这样Consumer就保证了消息局部有顺;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容