前言
再说mq之前我们先说说背景吧,MQ(message queue简称消息队列)主要作用不是通讯,主要是用于解除子系统间的耦合,所以异构系统间的通讯实际并不是mq发挥作用的场景,那反而是RPC(remote procedure call)发挥作用的时候, mq更适合于需要更大流量和高并发的大型系统场景,可以将消息队列视为一个可靠的通道,主交易过程在处理时,遇到需时较多同时又已经确定了条件的处理就丢到消息队列里进行后续处理,这样可以将主交易过程划分为一个一个可以异步处理的更小的处理过程,减少了主交易流程的处理时间,可以提供更快的响应速度和并发速度,例如,像淘宝这样的处理逻辑非常多的系统,在处理付款时,就可以将通知买家和卖家、记日志甚至记帐流程都放到消息队列里处理,整个主流程能够快速处理完成,继续处理下一个买家的请求
1.MetaQ简介
MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy。MetaQ具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景
2.MetaQ使用场景
(1) 日志传输,用于高吞吐量的日志传输;
(2) 消息广播,将消息放入Topic中,供所有的消费者消费;
(3) 数据的顺序同步功能,如mysql binlog复制;
(4) 分布式环境下(broker、producer、consumer都为集群)的消息路由,对顺序和可靠性有极高的要求的应用场景;
(5) 作为一般的MQ来使用其功能
原理介绍
3.MetaQ安装部署
MetaQ的安装比较简单,只需要将服务器包下载下来解压到指定位置就行。下载metaq-server-1.4.6.2.tar.gz(https://github.com/killme2008/Metamorphosis/wiki/ReleaseNotes)
使用下面命令进行解压
tar –zxvf metaq-server-1.4.6.2.tar.gz
一般情况下,我们需要用到的是其bin下的几个服务器脚本。
(1) Bin目录下有metaServer.sh脚本,该脚本是主要的执行脚本;
(2) Logs目录下有相关的MetaQ日志信息;
(3) Conf目录下有主要的配置文件server.ini;
(4) Lib目录下是相关的依赖包
启动服务器:
software/bin/metaServer.sh start;
关闭服务器:
software/bin/metaServer.sh stop
查看服务器状态:
software/bin/metaServer.sh status
注意点
需要先配置zookeeper,否则会启动失败
首先安装ZK
其次在software/metaq/conf 目录下打开server.ini文件,配置如下关联的ZK信息:
;zk的服务器列表 zk.zkConnect=192.168.66.78:2181 ;zk心跳超时,单位毫秒,默认30秒 zk.zkSessionTimeoutMs=30000 ;zk连接超时时间,单位毫秒,默认30秒 zk.zkConnectionTimeoutMs=30000 ;zk数据同步时间,单位毫秒,默认5秒 zk.zkSyncTimeMs=5000
启动成功以后在浏览器中输入http://192.168.66.78:8120/,会显示MetaQ主页面
4.项目中如何应用MetaQ
项目中的使用可以参照我在github上面的例子:https://github.com/xiaobianchen/arch-message/
metaq里面的代码
5.MQ术语介绍
Producer:
消息生产者,负责产生消息,一般由业务系统负责产生消息。
Consumer:
消息消费者,负责消费消息,一般是后台系统负责异步消费。
Consumer Group:
一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。
Topic:
消息的主题,由用户定义并在服务器端配置。Producer发送消息到某个Topic下,Consumer从Topic下消费消息。
Broker:
消息中转角色,负责存储消息,转发消息,一般也称为Server,在JMS规范中称为Provider。
分区(partition):
同一个topic下面还分为多个分区,如meta-test这个topic我们可以分为10个分区,分别有两台服务器提供,那么可能每台服务器提供5个分区,假设服务器id分别为0和1,则所有分区为0-0、0-1、0-2、0-3、0-4、1-0、1-1、1-2、1-3、1-4。
Offset:
消息在broker上的每个分区都是组织成一个文件列表,消费者拉取数据需要知道数据在文件中的偏移量,这个偏移量就是所谓offset。Offset是绝对偏移量,服务器会将offset转化为具体文件的相对偏移量。
广播消费(典型的朋友圈发微博):
一条消息被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被组中的每一个Consumer消费一次。
集群消费:
一个Consumer Group中的Consumer实例平均分摊消费消息。
主动消费:
Consumer主动向Broker发起获取消息请求,控制权完全在于Consumer应用。
被动消费:
Consumer注册一个Callback接口,由MetaQ后台自动从Broker接收消息,并回调Callback接口。
顺序消息:
消费消息的顺序要同发送消息的顺序一致,在MetaQ中,主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列中。
普通顺序消息:
顺序消息中的一种,正常情况下保证消息的顺序,但发生异常后,例如Broker重启,队列发生变化,产生短暂的消息顺序不一致。
严格顺序消息:
顺序消息的一种,无论什么情况下都能保证消息的顺序,牺牲了分布式的Failover的特性。
Message Queue:
在MetaQ中,所有的消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,Offset为java long类型,64位,理论上在100年内不溢出,所以认为是长度无限,队列中只保留几天的数据,之前的数据会被定时删除。
Messaging System:
消息中间件的统称,但不局限于消息中间件,与消息传输相关的类似系统。
metaq集群
http://www.iteye.com/magazines/107
http://blog.csdn.net/wych1981/article/details/45166769
http://www.linuxidc.com/Linux/2014-02/97299.htm
http://linuxblind.blog.51cto.com/7616603/1266752
https://my.oschina.net/MrMichael/blog/528196
https://github.com/killme2008/Metamorphosis/wiki/%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B
来源:oschina
链接:https://my.oschina.net/u/863334/blog/744371