这几天琢磨其余的东西,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也用到了这个玩意,我在作邮件调度的时候也用到了这个东西,实在是好用得很。