很久沒寫blog了,寫寫最近做的一些工作,給感興趣的朋友做參考。
首先是我們的
kafka的“復制品”metamorphosis做了1.4版本,實現了同步復制方案,broker本身也做了很多優化,總體而言meta是一個非常成熟可用的產品了。甚至可以說是我在淘寶做的最好的一個產品。有些朋友總是問我們為什么不直接用kafka,而要另寫一個?這里做個統一的解答。
(1)kafka是scala寫的,我對scala不熟悉,也不待見,考慮到維護和語言熟悉程度,用java重寫仍然是最好的選擇。
(2)其次,kafka的整個社區非常不活躍,發展太慢,而我又不愿意去學習scala來參與社區發展,那么唯一的出路就是自己寫。
(3)kafka的一些工作不能滿足我們的要求,比如一開始它連producer的負載均衡都沒有,它的消費者API設計還是比較蛋疼的。它也不支持事務,沒有考慮作為一個通用的MQ系統來使用。并且它也沒有高可用和數據高可靠的方案。
(4)我們做了什么呢?
a.用java徹底重寫整個系統,除了原理一致,整個實現是徹底重新實現的。
b.我們提供了生產者的負載均衡(仍然是基于zk),重新設計了消費者API,更符合 JMS的使用習慣。
c.我們提供了事務實現,包括producer和consumer端的,包括本地事務和符合XA規范的分布式事務實現。
d.我們提供了兩種數據高可靠方案:類似mysql的異步復制和同步復制方案。通過將消息復制到多個節點上來保證數據的高可靠。
e.我們提供了http協議的實現,并且本身使用協議也是類似memcached的文本協議,內部也增加了很多統計項目,可以以memcached的stats協議的方式來獲取純文本的統計信息。整個系統運維很方便。
f.提供了很多擴展應用:廣播消費者的實現,多種offset存儲的實現(默認的zookeeper,還有文件和mysql),tail4j用于作為agent發送日志,log4j appender擴展用于透明地使用log4j發送消息,hdfs writer用于將消息寫入hdfs,storm spout用于將消息接入storm做實時分析,基本上形成一套完整的工具鏈和擴展。
g.一些其他功能點:group commit提升數據可靠性和吞吐量,連接復用,集群下的順序消息發送,消息數據的無痛遷移和水平擴展,web管理平臺等。
meta未來會走開源的路子,不過不會是我來推動的,估計是在今年會有進展。
我最近還寫了一些小項目值得一提,首先是
aviator這個輕量級的表達式執行引擎發布了2.2.1版本,主要是這么幾個改進:
(1)支持多維數組變量的訪問,如a[0][0]
(2)添加Expression#getVariableNames()用于返回表達式的變量列表
(3)添加AviatorEvaluator#exec方法來簡化調用
(4)bug修正等。
maven直接升級:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>2.2.1</version>
</dependency>
其次,
hs4j這個handler socket的客戶端,由新浪微博的@趙鵬城實現了inc/dec協議,添加了incr和decr方法用于更新計數,感謝他的貢獻,如果你需要這兩個功能可以自己從github拉取源碼并構建打包,暫時不準備發布到maven。
第三,關注高可用的Transaction Manager實現的可以關注下我的
ewok項目,這是一個基于
BTM這個開源JTA實現,提供基于bookkeeper的高可用的TM項目。將事務日志寫到高可用的bookkeeper上,并利用zookeeper來做到故障的透明遷移,某個TM掛了,可以在其他機器上從bookkeeper拉取日志并恢復。代碼已經穩定并做了性能測試,沒有做進一步的破壞性測試。
BTM是一個比JOTM和atomikos更靠譜的開源JTA實現,并且性能也好上很多,代碼質量更不用說,建議有興趣的可以看一下。我也為它貢獻了
一個事務日志寫入優化的patch,日志寫入性能提升了近一倍。
最后,我在clojure上做了一些事情,首先是為
storm項目貢獻了兩個patch:利用curator做zookeeper交互和添加storm.ui.context.path選項,前者被作者接受,后者暫時只對我們有用。前者讓storm跟zk的交互更可用,后者是為storm ui添加了可選的相對路徑。你都可以在
我fork的分支上嘗試,curator的patch在storm 0.6.2上發布,現在還是snapshot狀態。昨天晚上牙痛睡不著,半夜寫了個
clojure STM profiler,用于統計分析clojure STM運行狀況,諸如事務運行次數和時間,事務的重試原因和次數等,可以針對每個dosync的form做統計,有興趣也可以看下。不過我其實更想將這個功能加入到clojure核心,會嘗試提交下pull request。
還有個工作上的變遷,我將在2月1號正式從呆了近三年的淘寶離職,加入一支充滿活力的創業團隊。從穩定的大公司出來,去加入一家初創公司,不能說沒有風險,但是我還是想去接受新的挑戰,愿意更新我的知識結構,愿意向牛人們學習。我在某個blog上說我今年遇到了人生中最大的挑戰和轉折,并不是說這個事情,而是我的兒子今年患了一場重病,慶幸在很多人的幫助和關心下,他勇敢地挺了過來,度過最困難的一關,現在還在繼續治療。我要感謝很多人,感謝淘寶,感謝我的TL華黎和鋒寒,感謝我的同事和朋友林軒,感謝我們的HR,感謝三年后打交道的很多同事。沒有他們,我今年真的過不了關,沒有他們,我也不能進入淘寶并呆上快三年。
最后的最后,我要特別感謝我的兒子,謝謝你的降生,謝謝你今年的勇敢,謝謝你給我們全家帶來的快樂,謝謝你繼續陪著我們 ,也希望你新年繼續勇敢地堅持下去,我們必將戰勝一切。