消息中间件Rabbitmq(05)
三丰 soft张三丰
MetaQ中间件
metaq是阿里团队的消息中间件,之前也有用过和了解过kafka,据说metaq是基于kafka的源码改过来的,他们之间的区别在哪里,接下来一探究竟。
由此实现一个重要的功能:挡住前端的数据洪峰,保证后端系统的稳定性。
1.支持严格的消息顺序
2.支持Topic与Queue两种模式
3.亿级消息堆积能力
4.比较友好的分布式特性
5.同时支持Push与Pull方式消费消息
究竟metaq是如何支持这5个特性的,带着问题去分析metaq。
MetaQ发展历史
2007年,淘宝实施了“五彩石”项目,将交易系统由单机交易升级到了分布式,这个过程中产生了Notify。
2010年,阿里巴巴B2B部门基于ActiveMQ的5.1版本也开发了自己的一款消息引擎,称为Napoli。
2011年,Linkin推出Kafka消息引擎,阿里巴巴在研究了Kafka的整体机制和架构设计之后,基于Kafka的设计使用Java进行了完全重写并推出了MetaQ 1.0版本,主要是用于解决顺序消息和海量堆积的问题,由开源社区killme2008维护。
2012年,阿里巴巴对于MetaQ进行了架构重组升级,开发出了MetaQ 2.0,这时就发现MetaQ原本基于Kafka的架构在阿里巴巴如此庞大的体系下很难进行水平扩展,所以在2012年的时候就开发了RocketMQ 3.0。
2015年,又基于RocketMQ开发了阿里云上的Aliware MQ和Notify 3.0。
2016年,阿里巴巴将RocketMQ的内核引擎捐赠给了Apache基金会。
MetaQ和RocketMQ区别:两者等价,在阿里内部称为MetaQ 3.0,对外称为RocketMQ 3.0。
以上就是RocketMQ的整体发展历史,其实在阿里巴巴内部围绕着RocketMQ内核打造了三款产品,分别是MetaQ、Notify和Aliware MQ。这三者分别采用了不同的模型:
MetaQ主要使用了拉模型,解决了顺序消息和海量堆积问题。
Notify主要使用了推模型,解决了事务消息
而云产品Aliware MQ则是提供了商业化的版本。
总结结构
主要配置介绍
•zk.zkEnable=true(是否注册到zk,默认为true) •zk.zkConnect=localhost:2181 (zk的服务列表) •zk.zkSessionTimeoutMs=30000(zk心跳超时,单位毫秒,默认30s) •zk.zkConnectionTimeoutMs=30000(zk连接超时,单位毫秒,默认30s) •brokerId :(服务器ID 必须是集群内唯一,必须为整形0-1024之间) •serverPort: (服务器端口) •hostName: (默认将取本机IP(多机网卡,需要指明) •dataLogPath: (日志数据文件路径,默认跟dataPath一样) •dataPath: (于指定默认的数据存储路径) •deletePolicy=delete,168 (数据删除策略,默认超过7天即删除,这里的168是小时 10s 为10秒 10m为分钟,默认为小时) •deleteWhen: (何时执行删除策略的cron表达式 默认是 0 0 6,18 ** ? ,也就是每天早晚6点执行策略) •flushTxLogAtCommit=1(事务日志的同步设置,0表示让操作系统决定,1表示每次commit同步,2表示每隔1s同步一次,此参数严重影响事务性能,可根据你需要的性能和可靠性之间权衡做出一个合理的选择,通常设置 2 每隔1s刷盘一次,最多丢失一秒内的运行事务,这样的可靠性是足够的,最安全的是 设置为1 但是严重影响性能,而0为安全最低 1>=2 >0 性能 0>=2>1) •unflushThreshold : (每隔多少条消息做一次磁盘sync,强制将更改的数据刷入磁盘,默认为1000。也就是在掉电情况下,最多允许丢失1000条消息。可设置为0,强制每次写入都sync。在设置为0的情况下,服务器会自动启用groupcommit技术,将多个消息合并一次sync来提示IO性能。进过测试,group commit情况下消息发送者的TPS没有受太大影响,但是服务端的负载会上升很多) •unflushInterval: (间隔多少毫秒定期做一次磁盘sync,默认是10s,也就是在服务器掉电情况下,最多丢失10s内发送过来的数据,不可设置为小于或等于0)
安装
下载metaq: http://fnil.net/downloads/index.html 安装metaq:
[root@localhost software]# pwd /export/software
[root@localhost software]# tar -zxvf metaq-server-1.4.6.2.tar.gz
[root@localhost software]# cd taobao
[root@localhost taobao]# ls COPYING.txt metamorphosis-server-wrapper README.md
[root@localhost taobao]# mv metamorphosis-server-wrapper metaq1.4.6.2
[root@localhost taobao]# cp metaq1.4.6.2 /usr/local -r
[root@localhost taobao]# cd /usr/local/metaq1.4.6.2/
配置metaq:
[root@localhost metaq1.4.6.2]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: standalone
[root@localhost metaq1.4.6.2]# netstat -ntlp | grep 2181
tcp 0 0 :::2181 :::* LISTEN 2542/java
[root@localhost metaq1.4.6.2]# pwd
/usr/local/metaq1.4.6.2
[root@localhost metaq1.4.6.2]# vim conf/server.ini
#配置metaq数据路径
;数据文件路径,默认在user.home/meta下
dataPath=/usr/local/metaq1.4.6.2/data
;日志数据文件路径,默认跟dataPath一样
dataLogPath=/usr/local/metaq1.4.6.2/data/logs
# 确保metaq zookeeper服务相关,依赖的zookeeper的地址是有效的,默认配置如下.同笔者的一样.所以无需修改
[zookeeper]
;zookeeper服务器列表
zk.zkConnect=localhost:2181
;zookeeper心跳超时,单位毫秒,默认30秒
zk.zkSessionTimeoutMs=30000
;zookeeper连接超时时间,单位毫秒,默认30秒
zk.zkConnectionTimeoutMs=30000
;zookeeper数据同步时间,单位毫秒,默认5秒
zk.zkSyncTimeMs=5000
启动Metaq:
[root@localhost bin]# pwd
/usr/local/metaq1.4.6.2/bin
[root@localhost bin]# ./metaServer.sh start
访问web管理平台 Web管理平台HTTP端口号为8120. 访问该端口查看管理平台
用Nginx代理8120端口.
upstream tomcat_tools.metaq.local {
server 127.0.0.1:8120 weight=10 max_fails=2 fail_timeout=300s;
}
server {
listen 80;
server_name tools.metaq.local.com;
root /usr/local/metaq1.4.6.2/;
access_log /usr/local/metaq1.4.6.2/logs/tools.metaq.local.com_access.log main;
error_log /usr/local/metaq1.4.6.2/logs/tools.metaq.local.com_error.log warn;
error_page 403 404 /40x.html;
location / {
index index.html index.htm;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat_tools.metaq.local;
expires 0d;
}
}
重新启动nginx,配置host,访问tools.metaq.local.com.
消息中间件Rabbitmq(01) 消息中间件Rabbitmq(02) 消息中间件Rabbitmq(03) 消息中间件Rabbitmq(04)