這幾天琢磨其餘的東西,Jafka源碼擱置了,對其解讀已經失去了興趣。爲了給本身一個交代,仍是寫個結尾系列吧。git
Log模塊並不是是log4j一套,而是Jafka的消息持久化系統,當初一掃而過,這麼精華的部分居然沒注意到。github
不過所謂O(1)的持久化效率而並不是多麼複雜,其實就是在offset處append而已。這個最重要的部分,如今算是弄清楚了。app
剩餘部分都沒有仔細讀過源碼,有些是從rockybean的博客中直接看的。分佈式
Jafka對NIO這塊的使用,至關值得參考和借鑑。不過對一些細節的處理,只有本身真正開發相關功能才能體會,因而決定先擱置了。排序
MetaQ聽說是淘寶內部的MQ,在Kafka上作了改進,能夠當作跟Jafka同源。clone了一份MetaQ的代碼,https://github.com/killme2008/Metamorphosis,粗略看了一下,看得出來是公司級別的開發,並不是爲開源而生,因此精細程度不如Jafka(指代碼級別的技巧),可是各類接口定義要更清晰一點。接口
找了MetaQ的文檔,對於MQ的特性和問題,作了一些總結,好好讀了一遍: http://alibaba.github.io/metaq/document/design/design.pdf內存
有幾個東西,確實是實踐出真知:開發
關於MQ的優先級文檔
MetaQ支持在內存中排序,可是放棄了磁盤系統的排序。get
關於重複消費(Exactly And Only Once)
保證送達,不保證不重複,而在業務中判斷重複,消息消費具備冪等性。
MetaQ在消息回溯時,使用了時間作offset。時間真是個好東西,分佈式的排序和一致性,靠這個省了好多事。twitter的UUID服務Snowflake也用到了這個玩意,我在作郵件調度的時候也用到了這個東西,實在是好用得很。