很久没写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,感谢三年后打交道的很多同事。没有他们,我今年真的过不了关,没有他们,我也不能进入淘宝并呆上快三年。
最后的最后,我要特别感谢我的儿子,谢谢你的降生,谢谢你今年的勇敢,谢谢你给我们全家带来的快乐,谢谢你继续陪着我们 ,也希望你新年继续勇敢地坚持下去,我们必将战胜一切。