分布式消息中间件 metaq 作者庄晓丹专访 -买球官网平台
声明:iteye精华文章的买球官网平台的版权属于iteye网站所有,严禁任何网站转载本文,否则必将追究法律责任!
metaq(全称metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于linkedin的kafka,但并不是kafka的一个copy。metaq具有消息存储顺序写、吞吐量大和支持本地和xa事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,目前在淘宝和支付宝有着广泛的应用。
github地址:
为了使大家对metaq有进一步的了解,本期我们采访了metaq的核心开发者庄晓丹。
iteye期待并致力于为国内优秀的开源项目提供一个免费的推广平台,如果你和你的团队希望将自己的开源项目介绍给更多的开发者,或者你希望我们对哪些开源项目进行专访,请告诉我们,发站内短信给或者发邮件到[email protected]即可。
先来个自我介绍吧!
我叫庄晓丹,工作5年左右,工作经历比较杂,在创业公司呆过,在大公司呆过。目前在avos的中国分公司工作,我们的主要产品是美味书签(和中文版的)、美味爱读()等。我的主要工作语言是clojure/java,编程既是我的工作,也是兴趣爱好。
metaq是什么?能做什么?
metaq(全称为metamorphosis)是一个淘宝开源的分布式的消息中间件,它是纯java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。这个产品是我在淘宝中间件团队发起并作为核心开发者的一个项目。第一个版本的完整代码包括完整的单元测试是我在两周内(印象中是,可能更短)写出来的。
metaq既然是一个消息中间件,那么消息中间件能做的事情,metaq都是可以做到的。消息中间件作为分布式系统可扩展、可伸缩性的关键一环,metaq可以起到很好的作用。
metaq项目的由来?
metaq的起源是我从对linkedin的开源mq(现在转移到的学习开始的,这是一个设计很独特的mq系统,它采用pull机制,而不是一般mq的push模型,它大量利用了zookeeper做服务发现和offset存储,它的设计理念我非常欣赏并赞同,强烈建议有兴趣的同学阅读一下它的,总体上说metaq的设计跟它是完全一致的。
可不可以说metaq是apache kafka的java实现 & 功能增强版本?
可以这样说,因为总体的设计是一致的,但是我们做了很多优化和改进。
可以简单概括下我们重新写metaq的原因:
- kafka是scala写的,我对scala不熟悉,并且在当时kafka整个社区的发展太缓慢了。
- 有一些功能是kakfa没有实现,但是我们却需要,比如事务、多种offset存储、高可用方案(ha)等
meta相对于kafka特有的一些功能:
- 文本协议设计,非常透明,支持类似memcached stats的协议来监控broker
- 纯java实现,从通讯到存储,从client到server都是重新实现。
- 提供事务支持,包括本地事务和xa分布式事务
- 支持ha复制,包括异步复制和同步复制,保证消息的可靠性
- 支持异步发送消息
- 消费消息失败,支持本地恢复
- 多种offset存储支持,数据库、磁盘、zookeeper,可自定义实现
- 支持group commit,提升数据可靠性和吞吐量。(目前kafka已实现)
- 支持消息广播模式
- 一系列配套项目:python/ruby/c/c 客户端、twitter storm的spout、tail4j等。
与其他消息系统(如activemq、hornetq)相比,metaq有哪些优势或特点?
activemq和hornetq都是符合java ee中jms规范的mq实现,两者都是很优秀的开源mq。同时两者也不局限在jms规范,同时也支持其他一些mq协议,如stomp协议、amqp协议等。相比来说,就我当时了解的情况来看,hornetq的性能会比activemq更强,因为hornetq使用jni基于异步io做了更多优化,而对于mq来说,最终的瓶颈都是落在io存储上。metaq的性能是远远超过这两个mq的,有一个网友做的比较可以说明一定问题(),但是这不能说metaq比它们就更优秀,因为这跟它们的实现,和面对的场景有很大关系。
activemq和hornetq,这两个mq从诞生起就是为了企业应用而设计的,jms规范本身也是企业应用系统的规范。这一套东西,我个人认为并不适合互联网应用。互联网应用通常面对的是海量的数据,并且通常对事务一致性的要求相对较弱,而企业应用对事务一致性的要求就相对很高。互联网应用为了处理大量请求,通常采用集群处理的方式,而jms规范并不重视分布式应用。我说的这个集群不仅仅是服务端broker的集群,还包括生产者和消费者都可能是一个又一个集群,而传统的jms规范是没有明确处理这些情况的。互联网应用还有一个问题是异构系统特别多,而jms规范只是java ee这个平台上的规范,对异构系统的接入也是一个比较麻烦的地方,不同的实现有很大的差异。
综合来讲,hornetq和activemq是为了企业级应用设计的消息中间件,而metaq从一开始就是为了大规模互联网应用设计的消息中间件,两者面对的场景和需求不同。开发者可根据实际的需求,选择合适的产品。
从mq的发展来看,我们可以看到,出现了越来越多特定领域的消息中间件,例如memcacheq、kestrel、beanstalkd甚至redis,它们很轻量级,并且不想做到全能,而只是解决一个领域的问题,我觉得这是未来的趋势。
metaq的内部是如何实现的?
从实现角度看,metaq充分利用zookeeper这个优秀的服务中心,作为服务注册和查找中心、客户端负载均衡和数据偏移量的分布式存储使用。zookeeper在metaq整个集群中扮演非常关键的角色。
metaq的存储实现与kafka是一致的,充分利用传统磁盘顺序读写非常高效的特点,并且利用group commit、sendfile系统调用等技术来充分提高io效率。
metaq的事务实现跟activemq是类似的,采用redo日志的方式,并遵循jta协议规范来实现分布式事务。
metaq的网络协议跟memcached文本协议类似,因为我本人非常熟悉memcached(开源的客户端是我开发的),但是metaq的协议引入了opaque的映射字段,提高请求的并行度。正因为采用文本协议,为metaq编写其他语言客户端是相对容易,并且管理metaq服务器也变的很容易,比如metaq提供了stats协议,通过telent就可以获取服务器的运行状况。
关于更多的实现细节可以看wiki上的文档:
metaq适合的场景?
- 日志传输,高吞吐量的日志传输,这本来也是kafka的强项。
- 消息广播功能,如广播缓存配置失效。
- 数据的顺序同步功能,如mysql binlog复制。
- 分布式环境下(broker、producer、consumer都为集群)的消息路由,对顺序和可靠性有极高要求的场景。
- 作为一般mq来使用的其他功能。
metaq的性能如何?
关于性能,可以看wiki上的性能测试页面
总体来说,metaq的性能还是很优秀,但是很大程度上取决于使用的存储磁盘的性能。
metaq目前的应用情况?
metaq在淘宝每日有十亿级别的消息流转,在支付宝有百亿级别的消息流转(作为storm的spout源),在阿里b2b也有部分应用。
在我目前的avos.com我们也在使用它作为后端系统的消息中间件。就我所知还有部分公司在尝试使用,例如腾讯、京东等。
目前metaq的主要维护者?有其他开发者参与贡献吗?
metaq还有一位主要开发者是我在淘宝的前同事(花名),以及一位非常热心的网友,贡献了不少的文档。
使用metaq应注意哪些事项?
metaq作为一个分布式的消息中间件,需要依赖zookeeper,对于一些规模不大、单机应用的场景,我个人并不是特别支持尝试用metaq,因为多一个依赖系统,其实就是多一份风险,在这些简单场景下,可能类似memcacheq、kestrel甚至redis等轻量级mq就非常合适。而metaq一开始就是为大规模分布式系统设计的,如果不当使用,可能没有带来好处,反而多出一堆问题。开发者需要根据自己面对的场景,团队的技术能力,做出一个合适的选择。
metaq采用的开源协议?该项目的后续开发计划?
metaq采用宽松的、对商业友好的apache 2.0开源协议。
新版本1.4.4一直在开发过程中,但是因为我个人工作重心的转移,整体进展不是特别理想。1.4.4主要想解决易用性和消费者负载均衡的问题。
特别希望有兴趣的朋友参与这个项目的发展,共同学习和促进。
github地址:
您还没有登录,请您登录后再发表评论
20 楼 wangguo 2013-01-18 10:45
同问,你说metaq比activemq, hornetq性能好很多,和rabbitmq比过吗?
rabbitmq没有比较过,不过我个人估计超过rabbitmq是没有悬念的,因为amqp的模型摆在那里。有兴趣可以测试对比看看。
我前段时间测过,1k消息metaq tps 1w多的时候,rabbitmq只有4k左右,rabbitmq消耗cpu较多,metaq消耗io较多,在我的特定机型下也说明不了问题。
亲,无花的博客链接错了,是这个啊http://jen.iteye.com/
sorry,已经改过来了
19 楼 2013-01-18 10:17
同问,你说metaq比activemq, hornetq性能好很多,和rabbitmq比过吗?
rabbitmq没有比较过,不过我个人估计超过rabbitmq是没有悬念的,因为amqp的模型摆在那里。有兴趣可以测试对比看看。
我前段时间测过,1k消息metaq tps 1w多的时候,rabbitmq只有4k左右,rabbitmq消耗cpu较多,metaq消耗io较多,在我的特定机型下也说明不了问题。
亲,无花的博客链接错了,是这个啊http://jen.iteye.com/
18 楼 2013-01-11 16:50
是不是你自己在配置有问题啊。
17 楼 2013-01-10 11:47
16 楼 2013-01-08 10:27
metaq是否解决以下问题:
1、是否支持动态topic,因为我的应用是交互式数据,一个点既是生产者也是消费者
2、数据的可靠性如何?因为涉及账务往来,数据丢失要降到最低
3、互联网中使用,对于网络延迟是否可以正常运行,我的点分布在全国各地
4、是否支持掉线重连,如机房网络故障,客户端是否可以自动重连
5、集群是否能自动切换其他cluster
15 楼 2013-01-04 16:03
14 楼 dennis_zane 2013-01-04 13:30
ha可以实现自动切换吗? 当master挂了,能够自动切换到slave上来?不需要人工干预!
抱歉,目前不支持自动切换,不是不能做,而是怕遇到“脑裂”问题。
13 楼 dennis_zane 2013-01-04 13:30
同问,你说metaq比activemq, hornetq性能好很多,和rabbitmq比过吗?
rabbitmq没有比较过,不过我个人估计超过rabbitmq是没有悬念的,因为amqp的模型摆在那里。有兴趣可以测试对比看看。
12 楼 dennis_zane 2013-01-04 13:29
实时可以设置拉取的平均间隔,服务端的刷盘时间等等参数,可以做到毫秒级别的延迟。
11 楼 2013-01-04 13:26
10 楼 2013-01-03 21:12
9 楼 2013-01-03 21:11
同问,你说metaq比activemq, hornetq性能好很多,和rabbitmq比过吗?
8 楼 2013-01-03 12:51
7 楼 2012-12-31 10:29
6 楼 2012-12-30 23:32
5 楼 2012-12-29 21:00
4 楼 2012-12-29 18:45
ha可以实现自动切换吗? 当master挂了,能够自动切换到slave上来?不需要人工干预!
3 楼 2012-12-29 17:19
2 楼 2012-12-29 13:36
1 楼 2012-12-29 12:56