MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy。MetaQ具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,目前在淘宝和支付宝有着广泛的应用。

Github地址:https://github.com/killme2008/Metamorphosis

为了使大家对MetaQ有进一步的了解,本期我们采访了MetaQ的核心开发者庄晓丹。

ITeye期待并致力于为国内优秀的开源项目提供一个免费的推广平台,如果你和你的团队希望将自己的开源项目介绍给更多的开发者,或者你希望我们对哪些开源项目进行专访,请告诉我们,发站内短信给ITeye管理员或者发邮件到webmaster@iteye.com即可。
目 录 [ - ]
先来个自我介绍吧!
MetaQ是什么?能做什么?
MetaQ项目的由来?
可不可以说MetaQ是Apache Kafka的Java实现 & 功能增强版本?
与其他消息系统(如ActiveMQ、HornetQ)相比,MetaQ有哪些优势或特点?
MetaQ的内部是如何实现的?
MetaQ适合的场景?
MetaQ的性能如何?
MetaQ目前的应用情况?
目前MetaQ的主要维护者?有其他开发者参与贡献吗?
使用MetaQ应注意哪些事项?
MetaQ采用的开源协议?该项目的后续开发计划?
先来个自我介绍吧! Top

我叫庄晓丹,工作5年左右,工作经历比较杂,在创业公司呆过,在大公司呆过。目前在AVOS的中国分公司工作,我们的主要产品是美味书签(delicious.com和中文版的meiweisq.com)、美味爱读(readwise.net)等。我的主要工作语言是Clojure/Java,编程既是我的工作,也是兴趣爱好。

MetaQ是什么?能做什么? Top

MetaQ(全称为Metamorphosis)是一个淘宝开源的分布式的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。这个产品是我在淘宝中间件团队发起并作为核心开发者的一个项目。第一个版本的完整代码包括完整的单元测试是我在两周内(印象中是,可能更短)写出来的。

MetaQ既然是一个消息中间件,那么消息中间件能做的事情,MetaQ都是可以做到的。消息中间件作为分布式系统可扩展、可伸缩性的关键一环,MetaQ可以起到很好的作用。
MetaQ项目的由来? Top

MetaQ的起源是我从对Linkedin的开源MQ(现在转移到Apache kafka的学习开始的,这是一个设计很独特的MQ系统,它采用pull机制,而不是一般MQ的push模型,它大量利用了zookeeper做服务发现和offset存储,它的设计理念我非常欣赏并赞同,强烈建议有兴趣的同学阅读一下它的设计文档,总体上说MetaQ的设计跟它是完全一致的。
可不可以说MetaQ是Apache Kafka的Java实现 & 功能增强版本? Top

可以这样说,因为总体的设计是一致的,但是我们做了很多优化和改进。

可以简单概括下我们重新写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有哪些优势或特点? Top

ActiveMQ和HornetQ都是符合Java EE中JMS规范的MQ实现,两者都是很优秀的开源MQ。同时两者也不局限在JMS规范,同时也支持其他一些MQ协议,如stomp协议、AMQP协议等。相比来说,就我当时了解的情况来看,HornetQ的性能会比ActiveMQ更强,因为HornetQ使用JNI基于异步IO做了更多优化,而对于MQ来说,最终的瓶颈都是落在IO存储上。MetaQ的性能是远远超过这两个MQ的,有一个网友做的比较可以说明一定问题(http://www.blogjava.net/livery/articles/391595.html),但是这不能说MetaQ比它们就更优秀,因为这跟它们的实现,和面对的场景有很大关系。

ActiveMQ和HornetQ,这两个MQ从诞生起就是为了企业应用而设计的,JMS规范本身也是企业应用系统的规范。这一套东西,我个人认为并不适合互联网应用。互联网应用通常面对的是海量的数据,并且通常对事务一致性的要求相对较弱,而企业应用对事务一致性的要求就相对很高。互联网应用为了处理大量请求,通常采用集群处理的方式,而JMS规范并不重视分布式应用。我说的这个集群不仅仅是服务端broker的集群,还包括生产者和消费者都可能是一个又一个集群,而传统的JMS规范是没有明确处理这些情况的。互联网应用还有一个问题是异构系统特别多,而JMS规范只是Java EE这个平台上的规范,对异构系统的接入也是一个比较麻烦的地方,不同的实现有很大的差异。

综合来讲,HornetQ和ActiveMQ是为了企业级应用设计的消息中间件,而MetaQ从一开始就是为了大规模互联网应用设计的消息中间件,两者面对的场景和需求不同。开发者可根据实际的需求,选择合适的产品。

从MQ的发展来看,我们可以看到,出现了越来越多特定领域的消息中间件,例如memcacheq、kestrel、beanstalkd甚至redis,它们很轻量级,并且不想做到全能,而只是解决一个领域的问题,我觉得这是未来的趋势。
MetaQ的内部是如何实现的? Top

从实现角度看,MetaQ充分利用zookeeper这个优秀的服务中心,作为服务注册和查找中心、客户端负载均衡和数据偏移量的分布式存储使用。Zookeeper在MetaQ整个集群中扮演非常关键的角色。

MetaQ的存储实现与kafka是一致的,充分利用传统磁盘顺序读写非常高效的特点,并且利用group commit、sendfile系统调用等技术来充分提高IO效率。

MetaQ的事务实现跟ActiveMQ是类似的,采用redo日志的方式,并遵循JTA协议规范来实现分布式事务。

MetaQ的网络协议跟memcached文本协议类似,因为我本人非常熟悉memcached(开源的xmemcached客户端是我开发的),但是MetaQ的协议引入了opaque的映射字段,提高请求的并行度。正因为采用文本协议,为MetaQ编写其他语言客户端是相对容易,并且管理MetaQ服务器也变的很容易,比如MetaQ提供了stats协议,通过telent就可以获取服务器的运行状况。

关于更多的实现细节可以看Wiki上的文档:

https://github.com/killme2008/Metamorphosis/wiki/design
https://github.com/killme2008/Metamorphosis/wiki/协议
MetaQ适合的场景? Top

日志传输,高吞吐量的日志传输,这本来也是kafka的强项。
消息广播功能,如广播缓存配置失效。
数据的顺序同步功能,如MySQL binlog复制。
分布式环境下(broker、producer、consumer都为集群)的消息路由,对顺序和可靠性有极高要求的场景。
作为一般MQ来使用的其他功能。
MetaQ的性能如何? Top

关于性能,可以看wiki上的性能测试页面 https://github.com/killme2008/Metamorphosis/wiki/performance

总体来说,MetaQ的性能还是很优秀,但是很大程度上取决于使用的存储磁盘的性能。
MetaQ目前的应用情况? Top

MetaQ在淘宝每日有十亿级别的消息流转,在支付宝有百亿级别的消息流转(作为storm的spout源),在阿里B2B也有部分应用。

在我目前的AVOS.com我们也在使用它作为后端系统的消息中间件。就我所知还有部分公司在尝试使用,例如腾讯、京东等。
目前MetaQ的主要维护者?有其他开发者参与贡献吗? Top

MetaQ还有一位主要开发者是我在淘宝的前同事无花(花名),以及一位非常热心的网友netcomm,贡献了不少的文档。
使用MetaQ应注意哪些事项? Top

MetaQ作为一个分布式的消息中间件,需要依赖zookeeper,对于一些规模不大、单机应用的场景,我个人并不是特别支持尝试用MetaQ,因为多一个依赖系统,其实就是多一份风险,在这些简单场景下,可能类似memcacheq、kestrel甚至redis等轻量级MQ就非常合适。而MetaQ一开始就是为大规模分布式系统设计的,如果不当使用,可能没有带来好处,反而多出一堆问题。开发者需要根据自己面对的场景,团队的技术能力,做出一个合适的选择。
MetaQ采用的开源协议?该项目的后续开发计划? Top

MetaQ采用宽松的、对商业友好的Apache 2.0开源协议。

新版本1.4.4一直在开发过程中,但是因为我个人工作重心的转移,整体进展不是特别理想。1.4.4主要想解决易用性和消费者负载均衡的问题。

特别希望有兴趣的朋友参与这个项目的发展,共同学习和促进。

Github地址:https://github.com/killme2008/Metamorphosis/

metaq的更多相关文章

  1. 消息中间件MetaQ高性能原因分析-转自阿里中间件

    简介 MetaQ是一款高性能的消息中间件,经过几年的发展,已经非常成熟稳定,历经多年双11的零点峰值压测,表现堪称完美. MetaQ当前最新最稳定的稳本是3.x系统,MetaQ 3.x重新设计和实现, ...

  2. Kafka/Metaq设计思想学习笔记 转

    转载自: http://my.oschina.net/geecoodeer/blog/194829 本文没有特意区分它们之间的区别,仅仅是列出其中笔者认为好的设计思想,供后续设计参考. 目前笔者并没有 ...

  3. metaq安装实例

    下载metaq: http://fnil.net/downloads/index.html 安装metaq: [root@localhost software]# pwd /export/softwa ...

  4. 中间件、MetaQ入门学习

    目录 . 中间件技术 . MetaQ中间件 . MetaQ编程实践 1. 中间件技术 0x1: 中间件简介 中间件(Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的 ...

  5. MetaQ安装部署文档

    一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...

  6. storm接入metaq时类不兼容错误 无法初始化MonitorLog

    在实际的项目中,需要storm从metaq中读取数据,一开始就有日志问题,查到是storm/lib中的log4j-over-slf4j和slf4j-api.jar包的不兼容导致的,这些日志包使用时必须 ...

  7. metaq spring

    spring metaq spring bean 配置 <bean id="sessionFactory" class="com.taobao.metamorpho ...

  8. 如何在Crystal框架项目中内置启动MetaQ服务?

    当Crystal框架项目中需要使用消息机制,而项目规模不大.性能要求不高时,可内置启动MetaQ服务器. 分步指南 项目引入crystal-extend-metaq模块,如下: <depende ...

  9. 如何在项目中引入MetaQ消息收发机制

    当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制. 关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorp ...

随机推荐

  1. javascript代码复用模式

    代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...

  2. 【ITOO 1】将List数据导出Excel表

    需求描述:在课表导入的时候,首先给用户提供模板(excel),然后将用户填写好的数据读取到list集合中.再进行判空处赋值处理,以及去重处理.这篇博客,主要介绍读取excel表和导出excel表的方法 ...

  3. ostack

  4. 如何根据IP查找计算机名

    示例:nbtstat -A  192.168.1.123 参考网址:http://jingyan.baidu.com/article/335530daa40d7f19cb41c312.html

  5. poj2031 Building a Space Station

    这题目,用G++ WA,用C++ AC. 题目要求,现给出n个球,然后要使每两个球直接或者间接连通,可以在任意两球之间做管道(在表面),最后的要求是,如果使得都连通的话,管道最小长度是多少. 思路简单 ...

  6. Android的Intent作用

    Android应用程序中有三个核心组件Activity.Services.Broadcast Receiver. Intent 提供应用程序之间的的交互机制,负责对一次操作的动作,动作涉及的数据,附加 ...

  7. 自定义Attribute 服务端校验 客户端校验

    MVC 自定义Attribute 服务端校验 客户端校验/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Autho ...

  8. ArcMap中用VBA读度矢量图层信息

    ArcMap下用VBA操作图层基本的过程了. Private Sub UIButtonControl1_Click() Dim pApp As IApplication Set pApp = Appl ...

  9. Composer -- PHP依赖管理的用法

    1:下载 1.1:方法一: 通过PHP来安装 cd /home/composer curl -sS https://getcomposer.org/installer | php  #这个命令会下载c ...

  10. .net4.0注册到IIS

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...