`

MetaQ使用心得

 
阅读更多
〇、信息来源:
 
一、MetaQ是什么?
    (一)、师从kafka ,是一款高可用,可无限水平扩展的消息中间件。核心为:
        1、他使用拉模型的消息队列。
        2、集群可水平扩展。
        3、能够保证顺序。该特征可应用于例如流计算或Mysql的binlog同步等。以及保证如订单顺序一致性。
    (二)、发展历程:
        1、Metamorphosis 1.x版本应该是庄晓丹((killme2008@gmail.com))和誓嘉(新浪微博: vintage-wang )共同开发。后庄晓丹从阿里离开。
        2、2.0版本开始,产品名称由“Metamorphosis”改为“Metaq”。主要由 誓嘉维护并开源
        3、现在3.0之后称作RocketMQ,但阿里对此开源程度热情降低,网上资料较少,例如Github上没有文档,需要申请后才可以获取文档。不知道是不是跟阿里云商业化有关。
    (三)、产品特点:
        1、保证消息顺序:消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了3条消息,分别是订单创建,订单付款,订单完成。消费时,要按照这个顺序消费才能有意义。但是同时订单之间是可以并行消费的。由此带来的特征:
            (1)、通过Offset递增进行访问数据,缺乏KV存储具有的update能力,如果要支持事务,必须引入类似于KV存储的模块才可以。
            (2)、不能保证消息不重复:为了追求高性能,并不保证此特性,要求在业务上进行去重,也就是说消费消息要做到幂等性。Metaq虽然不能严格保证不重复,但是正常情况下都不会出现重复发送、消费情况,只有网络异常,Consumer启停等异常情况下会出现消息重复。
        2、所有消息均必须落盘。与标准JMS不同。
        3、基于拉模型。注:似乎Meta2.X版本支持推模型
        4、其他:不支持分布式事务。而阿里Notify支持;消息类型只有一种字符串类型。与标准JMS不同;不支持JMS API;只支持发布订阅模式。与标准JMS不同。个人理解,该模式似乎更应称作“生产、消费者”模型。而Notify才更偏向于发布订阅模式;不支持优先级调度:由于Metaq所有消息都是持久化的,所以如果按照优先级来排序,开销会非常大,因此Metaq没有特意支持消息优先级,但是可以通过变通的方式实现类似功能,即单独配置一个优先级高的队列,和一个普通优先级的队列, 将不同优先级发送到不同队列即可。
    (四)、核心概念:
        1、Producer:消息生产者,负责产生消息,一般由业务系统负责产生消息。
        2、 Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费。注:Meta2.x也支持使用Push模型进行同步消息处理,但不太推荐。
        3、Broker:消息中转角色,负责存储消息,转发消息,一般也称为Server。在JMS规范中称为Provider。
        4、主动消费:Consumer主动向Broker发起获取消息请求,控制权完全在于Consumer应用。即Pull模型。
        5、被动消费:Consumer注册一个Callback接口,由Metaq后台自动从Broker接收消息,并回调Callback接口。即Push模型。
        6、普通顺序消息:消费消息的顺序要同发送消息的顺序一致,在Metaq中,主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列,这样Consumer就可以按照Producer发送的顺序去消费消息。
        7、Message Queue:在Metaq中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,offset为java long类型,64位,理论上在100年内不会溢出,所以认为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。在Metaq2.x之前版本,队列也称为“分区”,两者描述的是一个概念。但是按照2.x的实现,使用队列描述更合适。
    (五)、核心概念图:

 

        

 

 

 

        (1)、按照阿里说法,一个Broker支持万级Message Queue。

        (2)、如果不采用广播方式,一个队列中的某个消息只能被一个Consumer处理,处理后,Consumer自己管理的offset进行便宜。查找下一个消息。

        (3)、每个队列维持自己一套“索引”和“物理存储”。

 

二、怎么用MetaQ?



        (一)、Producer:在OnException中需要将失败消息记录到本地,新起线程不断尝试重发。
                注:即Producer自身也有消息日志机制;需要使用幂等策略(可参照ePay策略),保障重发也不会发生故障;可能需要做处理,保障与此关联的其他消息如订单的后续操作不能执行。
        (二)、Consumer:同样应该是处理异常后尝试,并保障后续关联消息不能执行。
                ??Executor怎么做异步,还没有理解透。
 
三、MetaQ核心原理(消息存储及读取)
    (一)、如何落盘:
        1、落盘采用两种方式:异步和同步。异步性能高,写完PAGECACHE(操作系统维护,应该是磁盘自身的缓冲区)直接返回,后续Broker后台异步批量写入磁盘,但不能保证全部消息不丢失。



 

 

        2、所有数据单独存储到一个物理队列,完全顺序写(串行方式刷盘),随机读。
        3、复制策略:目前仅支持异步复制,即类似于MySQL主从模式;不支持同步双写。未来版本会通过同步双写技术来完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。
 
    (二)、如何查找消息:使用“索引文件”(固定大小,可能在内存)+“物理文件”(物理存储)方式查找。如下图,先找索引,再找物理消息。

        

 

 

 

          

四、怎么做集群?
        

 
    1、异步复制后,部分消费者可以直接使用从节点;MetaQ2.X似乎还不支持同步复制。
    2、ZK节点,目录查找举例如下:
        (1)、生产者查找主Broker:/meta/brokers/topics(固定)/hello(Topic名称)/m1(Broker名称)-m(主Broker)
        (2)、消费者查找Offset:/meta/consumers(固定)/hellogroup(消费者组)/offsets(固定)/t1(Topic名称)/b1(Broker名称)-1(分区名称)
    3、负载均衡:
        (1)、生产者负载均衡:metaq发送消息的时候,生产者在发送消息的时候必须选择一台broker上的一个分区来发送消息,因此metaq在运行过程中,会把所有broker和对应的分区信息全部注册到ZK指定节点上,默认的策略是一个依次轮询的过程,生产者在通过ZK获取分区列表之后,会按照brokerId和partition的顺序排列组织成一个有序的分区列表,发送的时候按照从头到尾循环往复的方式选择一个分区来发送消息。注意:在broker因为重启或者故障等因素无法服务的时候,producer通过zookeeper会感知到这个变化,将失效的分区从列表中移除做到fail over。因为从故障到感知变化有一个延迟,可能在那一瞬间会有部分的消息发送失败。
        (2)、消费负载均衡:在消费过程中,一个消费者会消费一个或多个分区中的消息,但是一个分区只会由一个消费者来消费。MetaQ的消费策略是:
            1、每个分区针对同一个group只挂载一个消费者。
            2、如果同一个group的消费者数目大于分区数目,则多出来的消费者将不参与消费。
            3、如果同一个group的消费者数目小于分区数目,则有部分消费者需要额外承担消费任务。
            4、在某个消费者故障或者重启等情况下,其他消费者会感知到这一变化(通过 zookeeper watch消费者列表),然后重新进行负载均衡,保证所有的分区都有消费者进行消费。
 
 
 
 
 
  • 大小: 30 KB
  • 大小: 138.4 KB
  • 大小: 93.2 KB
  • 大小: 28.5 KB
  • 大小: 402.7 KB
  • 大小: 9.4 KB
  • 大小: 13.8 KB
  • 大小: 32.4 KB
  • 大小: 15.2 KB
  • 大小: 26.7 KB
  • 大小: 350.2 KB
分享到:
评论

相关推荐

    metamorphosis(metaq)

    《Metamorphosis (MetaQ) 服务端1.4.3版本详解及客户端使用》 Metamorphosis,简称MetaQ,是一款高效、稳定、可扩展的消息队列系统,由阿里巴巴开发并开源,主要用于解决分布式环境下的异步处理、解耦以及数据传输...

    Metaq原理与应用

    Metaq 是一种高性能、高可用的消息中间件,其设计灵感来源于 Kafka,但并不严格遵循任何特定的规范,如 JMS(Java Message Service)或 CORBA Notification 规范。Metaq 提供了丰富的特性来解决 Messaging System 中...

    metaQ向spark传数据

    总结来说,将MetaQ中的数据传递到Spark涉及的主要步骤包括:配置MetaQ与Kafka的连接,使用Spark Streaming从Kafka消费数据,使用Spark的DataFrame/Dataset API进行数据处理,以及选择合适的方式输出处理结果。...

    Metaq在JDk 7下的异常及解决方案

    异常的根本原因在于,Metaq的代码设计依赖于`DirectByteBuffer`的私有方法`viewedBuffer()`,而在JDK 7的某个更新版本中,这个方法的访问权限被限制,仅限于`java.nio`包内部使用。当Metaq在JDK 7环境下运行时,由于...

    metaq-server-1.4.6.2客户端+服务端

    下面我们将详细探讨MetaQ的核心特性、工作原理、客户端和服务端的使用,以及Javadoc文档的重要性。 **MetaQ核心特性** 1. **高可用**:MetaQ采用主从复制的架构,确保服务的高可用性。当主节点故障时,可以快速...

    metaq-server-1.4.6.2.tar.gz

    在本文中,我们将深入探讨MetaQ Server 1.4.6.2版本的核心特性、架构设计以及使用场景,帮助读者理解其工作原理和实际应用。 一、MetaQ简介 MetaQ的设计目标是构建一个稳定、高性能的消息队列系统,以支持大规模...

    metaQ的安装包

    此外,由于 MetaQ 使用 ZooKeeper,所以也需要安装并配置好 ZooKeeper 服务。 4. **安装步骤**: - 下载 MetaQ 安装包,该压缩包可能包含启动脚本、配置文件、依赖库等。 - 解压文件到指定目录,例如 `/usr/local...

    metaq-server-1.4.6.2.zip 和原版一样就是换了个名字

    例如,可能会采用零拷贝技术减少CPU的负载,通过线程池优化并发处理能力,以及使用高效的序列化和反序列化策略来提升消息传输效率。 在稳定性上,MetaQ提供了丰富的故障恢复机制。比如,当Broker发生故障时,...

    Metaq详细手册.docx

    《Metaq详细手册》 Metaq,源自LinkedIn的开源消息中间件Kafka的Java实现——Memorphosis,针对淘宝内部的应用需求进行了定制和优化。它遵循一系列设计原则,旨在提供高效、可靠且灵活的消息传递服务。 1. **消息...

    MetaQ 分布式消息服务中间件.pdf

    MetaQ是一款分布式消息服务中间件,其核心功能基于发布-订阅模型。在这一模型中,发布者(Producer)将消息发布到MetaQ,MetaQ会储存这些消息,而订阅者(Consumer)则通过pull方式来消费这些消息。具体而言,消费者...

    metaq消息中间件服务端、客户端资源汇集

    Metamorphosis是淘宝开源的一个Java消息中间件,他类似apache-kafka,但不是一个简单的山寨拷贝,而是做了很多改进和优化,项目的主页在淘蝌蚪上。服务端、客户端、javadoc都包含在内。

    支付宝钱包系统架构内部剖析(架构图)

    - **纯Java实现**:无论是通信层还是存储层,MetaQ均使用Java语言实现,这对于支付宝这样的大型企业而言非常重要,因为Java是业界广泛使用的编程语言之一,这意味着更容易找到熟练掌握该语言的开发人员。 - **事务...

    阿里rocketMQ

    阿里RocketMQ是一款开源的消息中间件,它在阿里巴巴集团内部广泛使用,并且被社区接纳成为Apache顶级项目。RocketMQ的设计目标是提供低延迟、高可靠、高可扩展的消息传递服务,适用于大规模分布式系统中的消息通讯。...

    支付宝之所以牛逼的原因:来看内部架构剖析

    Metamorphosis(MetaQ)是一个高性能、高可用、可扩展的分布式消息中间件,类似于LinkedIn的Kafka,具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,在...

    淘宝消息队列metamorphosis使用

    淘宝消息队列metamorphosis使用,下载java项目后查看readme.txt文本配置zookeeper,metaq后在测试代码修改下自己的配置即可执行demo,可以通过生产者生产消息,消费者消费消息

    Storm项目:流数据监控(下)

    软件(阿里),其对应的许多技术文档还是比较容易看的,并且Github提供了许多的应用实例,所以使用MetaQ作为Storm的消息源之一是必须掌握的。该模拟项目中,使用MetaQ作为storm的消息源,MetaqSpout从指定的...

    Storm实时处理方案架构.docx

    该部分可以使用多种数据收集方式,包括使用消息队列(MetaQ)、直接通过网络Socket传输数据、前端业务系统专有数据采集API和Log文件监控等。 1.1 使用消息队列(MetaQ) 使用消息队列作为数据中间处理组件的原因是...

Global site tag (gtag.js) - Google Analytics