再说mq以前咱们先说说背景吧,MQ(message queue简称消息队列)主要做用不是通信,主要是用于解除子系统间的耦合,因此异构系统间的通信实际并非mq发挥做用的场景,那反而是RPC(remote procedure call)发挥做用的时候, mq更适合于须要更大流量和高并发的大型系统场景,能够将消息队列视为一个可靠的通道,主交易过程在处理时,遇到需时较多同时又已经肯定了条件的处理就丢到消息队列里进行后续处理,这样能够将主交易过程划分为一个一个能够异步处理的更小的处理过程,减小了主交易流程的处理时间,能够提供更快的响应速度和并发速度,例如,像淘宝这样的处理逻辑很是多的系统,在处理付款时,就能够将通知买家和卖家、记日志甚至记账流程都放到消息队列里处理,整个主流程可以快速处理完成,继续处理下一个买家的请求java
MetaQ(全称Metamorphosis)是一个高性能、高可用、可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并非Kafka的一个Copy。MetaQ具备消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景mysql
(1) 日志传输,用于高吞吐量的日志传输;linux
(2) 消息广播,将消息放入Topic中,供全部的消费者消费;git
(3) 数据的顺序同步功能,如mysql binlog复制;github
(4) 分布式环境下(broker、producer、consumer都为集群)的消息路由,对顺序和可靠性有极高的要求的应用场景;sql
(5) 做为通常的MQ来使用其功能浏览器
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主页面
项目中的使用能够参照我在github上面的例子:https://github.com/xiaobianchen/arch-message/
metaq里面的代码
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-一、0-二、0-三、0-四、1-0、1-一、1-二、1-三、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