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