第三屆阿里中間件性能挑戰(zhàn)賽初賽-答辯資料學習

題目

題目內(nèi)容

Topic類似于水壩(蓄積功能痪枫,消峰填谷之利器)贴妻,Queue類似于水渠帚呼;每當新建一個Queue的時候,可以選擇綁定到幾個Topic稠歉,類似于水渠從水壩引水; 每個Topic可以被任意多個Queue綁定汇陆,這點與現(xiàn)實生活不太一樣怒炸,因為數(shù)據(jù)可以多次拷貝; 在發(fā)送的時候毡代,可以選擇發(fā)送到Topic阅羹,也可以選擇直接發(fā)送到Queue勺疼;直接發(fā)送到Queue的數(shù)據(jù)只能被對應Queue消費,不能被其他Queue讀取到捏鱼; 在消費的時候恢口,除了要讀取綁定的Topic的數(shù)據(jù),還要去取直接發(fā)送到該Queue的數(shù)據(jù)穷躁。

程序目標

實現(xiàn)以下接口:

  • Producer的createBytesMessageToTopic(topic, body)
  • Producer的createBytesMessageToQueue(queue, body)
  • Producer的send(message)
  • PullConsumer的attachQueue(queue, topics)
  • PullConsumer的poll()
程序校驗邏輯
  1. 10~20個線程(位于同一進程中)各自獨立調(diào)用Producer發(fā)送消息(每個線程啟動一個Producer,每條消息隨機發(fā)送到某個Topic或者Queue)因妇,持續(xù)時間T1问潭,請注意把消息數(shù)據(jù)寫入磁盤中
  2. 強行kill Producer進程,未寫入磁盤的消息都會丟失
  3. 10~20個線程(位于同一進程中)獨立調(diào)用Consumer收取消息(每個線程啟動一個Consumer婚被,attach到指定的Queue狡忙,不同的Consumer不會attach同一個Queue),驗證消息順序準確性址芯,可靠性灾茁,消費持續(xù)的時間為T2,消費到的總消息數(shù)目為N
  4. 以N/(t1+t2)來衡量性能
補充說明
  1. 測試時谷炸,topic和queue的數(shù)目大約是100個(其中queue的數(shù)目與消費者線程數(shù)相等)北专;
  2. 測試時,消息大小不會超過256K旬陡;
  3. 可靠性是指拓颓,消息不能丟失,且消息的內(nèi)容不能被篡改描孟;在測試消費的時候驶睦,會對消息的body,headers,properties的內(nèi)容進行校驗;
  4. header與properties中key和value都不會插入null或空值匿醒;
  5. 僅允許依賴JavaSE8包含的lib场航;
消息順序的說明
  1. 順序只針對單個topic或者queue,不同topic廉羔,不同queue溉痢,topic與queue之間都不用考慮順序;
  2. 消息產(chǎn)品的一個重要特性是順序保證蜜另,也就是消息消費的順序要與發(fā)送的時間順序保持一致适室;
  3. 在多發(fā)送端的情況下,保證全局順序代價比較大举瑰,只要求各個發(fā)送端的順序有保障即可捣辆; 舉個例子P1發(fā)送M11,M12,M13,P2發(fā)送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. 題目要求實現(xiàn)五個接口罢坝,分別對應于Producer生產(chǎn)消息廓握、發(fā)送消息,Consumer綁定topic和queue嘁酿、消費消息隙券;
  2. topic可以存儲數(shù)據(jù),queue也可以存儲數(shù)據(jù)闹司;
  3. Producer可以把消息發(fā)送到任意的topic和queue中娱仔,但是一條消息只能發(fā)送到一個topic或queue中;
  4. Consumer和queue數(shù)量相等游桩,兩者一一對應牲迫,一個Consumer綁定一個queue和多個topic,不同的Consumer綁定不同的queue借卧,topic可以相同盹憎;
  5. Consumer消費數(shù)據(jù)時,只保證對應Producer局部有序谓娃,即Consumer消費某topic/queue的消息時脚乡,來自同一Producer的數(shù)據(jù)其接收順序與發(fā)送順序相同;

答辯資料解讀

初賽第六名代碼鏈接(本人非作者):

https://github.com/whutjs/MessageSystem

生產(chǎn)者架構(gòu)
生產(chǎn)者架構(gòu)圖
  1. 每個生產(chǎn)者對應一個輸出文件滨达;
  2. 生產(chǎn)者每生產(chǎn)一條消息奶稠,就把消息編碼后寫入ByteBuffer中,再把ByteBuffer中二進制數(shù)據(jù)寫入對應topic或queue的Cache中捡遍,然后清空ByteBuffer锌订;
  3. 當topic/queue對應的Cache存滿后,就把這個Cache中所有二進制數(shù)據(jù)寫到輸出文件對應的ByteBuffer中画株;
  4. 寫入ByteBuffer時依次寫入topic/queue的編號辆飘、數(shù)據(jù)長度的類型、數(shù)據(jù)長度和多條消息的二進制數(shù)據(jù)谓传;
  5. ByteBuffer存滿后就把數(shù)據(jù)刷到輸出文件中蜈项;
消費者架構(gòu)
消費者架構(gòu)圖
  1. 一個文件對應一個FileReadCache,一個消費者對應一個FileReadCache续挟;
  2. 每個消費者擁有一個ConcurrentLinkedQueue紧卒,調(diào)用poll()方法讀取消息;
  3. 若queue中沒有消息诗祸,且對應的FileReadCache沒有讀完跑芳,則通過FileReadCache解碼出一條消息轴总,然后MessageLoader把消息分發(fā)到訂閱了此topic/queue的Consumer的queue中;
  4. 若queue中沒有消息博个,且對應的FileReadCache已經(jīng)讀完怀樟,則降低該消費者線程的優(yōu)先級,這樣其它Consumer就會多占用CPU來解碼消息盆佣,并把該消費者需要的消息發(fā)過來往堡,存到queue中;
  5. 所有的FileReadCache都把對應的文件讀完了共耍,MessageLoader發(fā)送endMsg到所有Consumer的queue中投蝉,這樣所有Consumer就消費結(jié)束;
消息存儲結(jié)構(gòu)
消息存儲結(jié)構(gòu)
  1. 每個Producer對應一個輸出文件征堪,文件中存儲二進制數(shù)據(jù);
  2. 文件中數(shù)據(jù)的結(jié)構(gòu):topic/queue的編號关拒、數(shù)據(jù)長度的類型佃蚜、數(shù)據(jù)長度、多條消息的二進制數(shù)據(jù)着绊,然后是下一個topic/queue的數(shù)據(jù)谐算;
  3. 消息的結(jié)構(gòu):消息頭標識、消息id的長度归露、消息id的二進制數(shù)據(jù)洲脂、key的長度、key的二進制數(shù)據(jù)剧包、val的長度恐锦、val的二進制數(shù)據(jù)、消息體開頭標識疆液、消息體的長度一铅、消息體的二進制數(shù)據(jù),然后是下一條消息的數(shù)據(jù)堕油;
如何解碼二進制數(shù)據(jù)
  1. 因為文件是追加寫入的潘飘,因此最開始的消息寫在文件的最前面;
  2. 讀取數(shù)據(jù)時掉缺,把當前topic/queue對應的整塊Cache數(shù)據(jù)加載到ByteBuffer中卜录,一次解析出一條消息,再把該消息push給訂閱了該topic/queue的Consumer眶明;
  3. 當前topic/queue的消息被解析完后艰毒,再加載下一個topic/queue對應的Cache數(shù)據(jù);
如何保證數(shù)據(jù)的有序性

有序性示例

圖中producer1發(fā)送3條數(shù)據(jù)給topic1赘来、2條數(shù)據(jù)給topic2现喳,consumer1訂閱了topic1和topic2凯傲;需保證consumer1中來自topic1的3條數(shù)據(jù)其順序與其在producer1中相同,來自topic2的2條數(shù)據(jù)其順序與其在producer1相同嗦篱,來自不同topic的數(shù)據(jù)沒有順序要求冰单;
原理:File中消息的順序與Producer一致,F(xiàn)ileReadCache從前往后依次解析File中的消息灸促,然后把消息push給Consumer诫欠,這樣Consumer就保證了消息局部有順;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浴栽,一起剝皮案震驚了整個濱河市荒叼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌典鸡,老刑警劉巖被廓,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萝玷,居然都是意外死亡嫁乘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門球碉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓斧,“玉大人,你說我怎么就攤上這事睁冬】娲海” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵豆拨,是天一觀的道長直奋。 經(jīng)常有香客問我,道長施禾,這世上最難降的妖魔是什么帮碰? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拾积,結(jié)果婚禮上殉挽,老公的妹妹穿的比我還像新娘。我一直安慰自己拓巧,他們只是感情好斯碌,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肛度,像睡著了一般傻唾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天冠骄,我揣著相機與錄音伪煤,去河邊找鬼。 笑死凛辣,一個胖子當著我的面吹牛抱既,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扁誓,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼防泵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝗敢?” 一聲冷哼從身側(cè)響起捷泞,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寿谴,沒想到半個月后锁右,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡讶泰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年骡湖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峻厚。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谆焊,靈堂內(nèi)的尸體忽然破棺而出惠桃,到底是詐尸還是另有隱情,我是刑警寧澤辖试,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布辜王,位于F島的核電站,受9級特大地震影響罐孝,放射性物質(zhì)發(fā)生泄漏呐馆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一莲兢、第九天 我趴在偏房一處隱蔽的房頂上張望汹来。 院中可真熱鬧,春花似錦改艇、人聲如沸收班。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摔桦。三九已至,卻和暖如春承疲,著一層夾襖步出監(jiān)牢的瞬間邻耕,已是汗流浹背鸥咖。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兄世,地道東北人啼辣。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像碘饼,于是被迫代替她去往敵國和親熙兔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,723評論 13 425
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理艾恼,服務發(fā)現(xiàn)住涉,斷路器,智...
    卡卡羅2017閱讀 134,666評論 18 139
  • 本文轉(zhuǎn)載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,471評論 0 34
  • Kafka入門經(jīng)典教程-Kafka-about云開發(fā) http://www.aboutyun.com/threa...
    葡萄喃喃囈語閱讀 10,833評論 4 54
  • 背景介紹 Kafka簡介 Kafka是一種分布式的钠绍,基于發(fā)布/訂閱的消息系統(tǒng)舆声。主要設計目標如下: 以時間復雜度為O...
    高廣超閱讀 12,836評論 8 167