2019独角兽企业重金招聘Python工程师标准>>>
这几天琢磨其他的东西,Jafka源码搁置了,对其解读已经失去了兴趣。为了给自己一个交代,还是写个结尾系列吧。
log
Log模块并非是log4j一套,而是Jafka的消息持久化系统,当初一扫而过,这么精华的部分竟然没注意到。
不过所谓O(1)的持久化效率而并非多么复杂,其实就是在offset处append而已。这个最重要的部分,现在算是弄清楚了。
剩余部分都没有仔细读过源码,有些是从rockybean的博客中直接看的。
Jafka对NIO这块的使用,相当值得参考和借鉴。不过对一些细节的处理,只有自己真正开发相关功能才能体会,于是决定先搁置了。
关于MetaQ
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支持在内存中排序,但是放弃了磁盘系统的排序。
-
关于重复消费(Exactly And Only Once)
保证送达,不保证不重复,而在业务中判断重复,消息消费具有幂等性。
MetaQ在消息回溯时,使用了时间做offset。时间真是个好东西,分布式的排序和一致性,靠这个省了好多事。twitter的UUID服务Snowflake也用到了这个玩意,我在做邮件调度的时候也用到了这个东西,实在是好用得很。