学习RabbitMQ(五)
消息中间件就是在消息的传输过程中保存消息的容器。消息中间件再将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递它为止,当然,消息队列保存消息也是有期限点的。
一、消息中间件特点:
1.1、采用异步处理模式
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接受者则订阅或是监听该通道。一条消息可能最终转发给一个或多个消息接受者,这些接受者都无须对消息发送者做出同步回应。整个过程是异步的。比如用户消息注册,注册完毕后过段时间发送邮件或者短息
1.2、应用程序和应用程序调用关系为松耦合关系
发送者和接受者不必了解对方、只需要确认消息
发送者和接受者不必同时在线
比如在线交易系统为了保证数据的最终一致,在支付系统处理完成后会把支付结果放到消息中间件里通过订单系统修改订单支付状态。两个系统通过 消息中间件解耦
二、消息传递服务模型:
2.1、消息中间件的传递模型:
2.1.1、点对点模型(PTP)
点对点模型用于消息生产者和消息消费者之间点对点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传送给消费者之前它被存储在这个队列中。队列消息可以放在内存中也可以是持久的,以保证在消息服务出现故障时扔然能够传递消息
点对点模型特点:
(1)、每个消息只用一个消费者
(2)、发送者和接受者没有时间依赖
(3)、接受者确认消息接受和处理成功
2.1.2、发布-订阅模型(Pub/Sub)
发布者/订阅者模型支持向一个特定的消息主题生产消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。
这种模式被概括为:多个消费者可以获得消息。在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便能够消费者订阅。订阅者必须保持持续的活动状态以接受消息,除非订阅者建立了持久的订阅。在这种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。
发布/订阅模型特性:
(1)、每个消息可以有多个订阅者
(2)、客户端只有订阅后才能接收到消息
(3)、持久订阅和非持久订阅
发布/订阅模型特点:
(1)、发布者和订阅者有时间依赖
接收者和发布者只有建立订阅关系才能收到消息
(2)、持久订阅
订阅关系建立后,消息就不会消失,不管订阅者是否都在线
(3)、非持久订阅
订阅者为了接收消息、必须一直在线,当只有一个订阅者时约等于点对点模式
2.2、消息中间件分类:
2.2.1、(push)推消息模型:消息生产者将消息发送给消息传递服务,消息传递服务又将消息推送给消息消费者。
2.2.2、(pull)拉消息模型:消费者请求消息服务接收消息,消息生产者从消息中间件拉该消息。
Metaq
Rabbitmq是一个在AMQP协议标准基础上完整的,可复用的企业消息系统。采用Erlang实现的工业级的消息队列(MQ)服务器。
AMQP(高级消息队列协议)是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP客户端能够无视消息的来源任意发送和接收信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。
安装Rabbitmq:
[root@linux-node3 ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@linux-node3 ~]# rpm -ivh epel-release-6-8.noarch.rpm
[root@linux-node3 ~]# yum install -y rabbitmq-server
[root@linux-node3 ~]# /etc/init.d/rabbitmq-server start
[root@linux-node3 ~]# chkconfig rabbitmq-server on
[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list ##列出所有的插件
[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management ##启用web监控插件
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart
Restarting rabbitmq-server: SUCCESS
rabbitmq-server.
[root@linux-node3 ~]# netstat -lntup|grep 5672
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 2939/beam.smp
tcp 0 0 0.0.0.0:55672 0.0.0.0:* LISTEN 2939/beam.smp
tcp 0 0 :::5672 :::* LISTEN 2939/beam.smp
[root@linux-node3 ~]# rabbitmqctl add_vhost test ##创建vhost:test
Creating vhost "test" ...
...done.
[root@linux-node3 ~]# rabbitmqctl list_vhosts ##遍历所有虚拟主机信息
Listing vhosts ...
/
test
...done.
[root@linux-node3 ~]# rabbitmqctl add_user test 123456 ##添加用户及密码
Creating user "test" ...
...done.
[root@linux-node3 ~]# rabbitmqctl set_user_tags test administrator ##设置用户test的角色
Setting tags for user "test" to [administrator] ...
...done.
[root@linux-node3 ~]#rabbitmqctl set_permissions -p test test ".*" ".*" ".*" ##绑定权限,并且具备读写的权限
Setting permissions for user "test" in vhost "test" ...
...done.
[root@linux-node3 ~]# rabbitmqctl list_queues ##显示所有队列
Listing queues ...
...done.
[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart ##一定要restart
Restarting rabbitmq-server: SUCCESS
rabbitmq-server.
常用命令:
/etc/init.d/rabbitmq-server start|restart|stop|reload
rabbitmqctl add_vhost vhostname 创建vhost
rabbitmqctl delete_vhost vhostname 删除vhost
rabbitmqctl list_vhosts 遍历所有虚拟主机信息
rabbitmqctl add_user username password 添加用户及密码
rabbitmqctl change_password username newpassword 修改用户密码
rabbitmqctl set_user_tags username administrator 设置username的角色(administrator)
rabbitmqctl set_permissions -p vhost user ".*" ".*" ".*" 绑定权限,并且具备读写的权限
rabbitmqctl list_queues 显示所有队列
注:不管能否解决你遇到的问题,欢迎相互交流,共同提高!
###############################################################################################
1.消息中间件简介
消息中间件是在消息的传输过程中保存消息的容器。消息中间件在将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递,如果发送消息时接受者不可用,消息队列会保留消息,知道可以成功传递它为止,当然,消息队列保持消息也是有期限的。
2.消息中间件特点
- 采用异步处理模式
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列
上,消息接受者则订阅或是监听通道。
- 应用程序和应用程序调用关系为松耦合关系
发送者和接受者不必了解对方、只需要确认消息
发送者和接受者不必同时在线
3.消息传递服务模型
4.消息队列的作用
解耦,异步,缓冲,收集,队列,存储
5.消息中间件的传递模型
- 点对点模型(PTP)
每个消息只用一个消费者
发送者和接受者没有时间依赖
接受者确认消息接受和处理成功
- 发布-订阅模型(Pub/Sub)
每个消息可以有多个订阅者
客户端只有订阅后才能接收消息
持久订阅和非持久订阅
6.发布-订阅模型特点
- 发布者和订阅者有时间依赖:接受者和发布者只有建立订阅关系才能收到消息
- 持久订阅:订阅关系建立后,消息就不会消失,不管订阅者是否都在线
- 非持久订阅:订阅者为了接受消息,必须一直在线,当只有一个订阅时约等于点对点模式
7. 互联网消息中间件应用场景
1.网站用户注册,注册成功后会发送邮件确认或短信(异步)
填写注册信息--用户注册服务--消息中间件--邮件服务|短信服务
2.日志进行集中收集,用于计算PV,用户行为分析
应用服务|应用服务|--消息中间件--pv分析服务|行为分析服务
3.数据复制
将数据从源头复制到多个目的地,一般是要求顺序或者保证因果序列
用于跨机房数据传输、搜索、离线数据计算
DB--DB Sync--Broker--Search|hadoop|DB
4. 延迟消息发布和暂存
把消息中间件当成可靠的消息暂存地
定时进行消息投递,比如模拟用户秒杀访问,进行系统性能压测
5.消息广播
缓存数据同步更新
往应用推送数据
8.消息中间件分类
1.推消息模型(push):消息生产者将消息发送给消息传递服务,消息传递服务又将消息推给消费者--场景:交易,注册
2.拉消息模型(pull):消费者请求消息服务接受消息,消息生产者从消息中间拉该消息--场景:行为分析,PV计算
9.metaq消息中间件(pull)
metaq是一款完全的队列模型消息中间件,服务器使用java语言编写,可在多种软硬件平台上部署。客户端支持java/c++编程语言。单台服务器可支持1万以上各消息队列,通过扩容服务器,队列数几乎可任意横向扩展。每个队列都是持久化,长度无限(取决于磁盘空间大小),并且可从队列任意位置开始消费
官网:http://metaq.taobao.org
10.metaq特点
1.生产者、服务器和消费者都可分布式
2.消息存储顺序读写
3.性能极高,吞吐量大
4.支持消息顺序
5.客户端pull,随机读,批量拉数据
6.数据迁移,扩容对用户透明
7.消费状态保存在客户端
11.rabbitMQ
是一个在AMQP协议标准基础上完整的,采用Erlang实现的工业级的消息队列MQ服务器
12.rabbitMQ架构--运行原理
13.rabbitMQ重要术语
1.sever(broker):接受客户端连接,实现AMQP消息队列路由功能的进程
2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange 和Quece,但是权限控制的最小粒度是Virtual Host
3.Exchang:接受生产者发送的消息,并根据Binding规则江消息路由给服务器中的队列,Exchange Type 决定了Exchange路由消息的行为,例如:在Rabbitmq中,
Exchange Type有direct ,fanout和topic三种,不用类型的exchange路由的行为是不一样的
4.Message Queue:消息队列,用于存储还未被消费者消费的消息
5.Message:由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化,由那个Message Queue接受,优先级是多少等,而Body是真正需要传输的APP数据
6.Binding key:所谓绑定就是将一个特定的exchange 和一个特定的queue绑定起来,绑定关键字为bindinkey
14.rabbitMQ常用配置介绍
一般情况下,rabbitMQ的默认配置就足够了,如果希望特殊配置的话,有2个途径
1.环境变量的配置文件rabbitmq-env.conf
2.配置信息的配置文件rabbitmq.config
注意,这2个文件默认是没有的,如果需要必须自己创建
1.rabbitmq-env.conf这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下,这个目录需要自己创建
1
2
3
4
|
rabbitmq_node_ip_address:指定ip地址 rabbitmq_node_port:指定端口号,more5672 rabbitmq_config_file:配置文件的路径,注意配置文件后缀必须是.config rabbitmq_log_base:日志文件路径 |
2.rabbitmq.config这是一个标准的erlang配置文件,它必须符合erlang配置文件的标准。erlangtuple,结构为{key,value},key为atm类型,value为一个term,其中关键参数为:
1
2
3
|
1.tcp_listerners设置rabbimq的监听端口,默认为5672 2.disk_free_limit磁盘低水位线,鄀磁盘容量低于指定值则停止接收数据 3.vm_memory_high_watemark,设置内存低水位线,若低于该水位线,则开启流控机制,默认值是0.4,即内存总量的40% |
15.rabbitMQ安装
1
2
3
4
5
6
7
8
9
10
11
12
13
|
wget http: //mirrors .ustc.edu.cn /fedora/epel/6/x86_64/epel-release-6-8 .noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm yum install rebbitmq-server -y /usr/lib/rabbitmq/bin/rabbitmq-plugins list /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management /etc/init .d /rabbitmq-server start rabbitmqctl add_vhost test # 创建vhost rabbitmqctl delete_vhost test # 删除vhost rabbitmqctl list_vhosts # 遍历所有虚拟主机信息 rabbitmqctl add_user test test # 添加用户及密码 rabbitmqctl set_permissions -p test test test ".*" ".*" ".*" # 绑定权限,并且具备读写的权限 rabbitmqctl list_queues -p test # 显示所有队列 |
#######################################################################################
[root@rabbitmq ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@rabbitmq ~]# uname -r
2.6.32-642.el6.x86_64
#基础环境配置hostname sed -i "2c HOSTNAME=rabbitmq" /etc/sysconfig/network hostname rabbitmq #sysctl cat >> /etc/sysctl.conf <<EOF net.ipv4.tcp_fin_timeout = 5 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 EOF sysctl -p #设置连接数最大值 echo '* - nofile 65535' >>/etc/security/limits.conf ulimit -SHn 65535 #selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 getenforce #chkconfig export LANG=en for zsq in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd"` do chkconfig $zsq off done /etc/init.d/iptables stop #date yum -y install ntpdate \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "#time sync by zsq at $(date +%F)" >> /var/spool/cron/root echo "*/10 * * * * /usr/sbin/ntpdate 10.10.88.1 &>/dev/null" >>/var/spool/cron/root #Install rabbitmq yum install wget vim -y cd /usr/local/src/ wget http://www.rabbitmq.com/releases/erlang/erlang-18.3.4.4-1.el6.x86_64.rpm rpm -ivh erlang-18.3.4.4-1.el6.x86_64.rpm wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm #安装出错可以替换下YUM链接 # sed -i -e '3 s/^#//' /etc/yum.repos.d/epel.repo # sed -i -e '4 s/^/#/' /etc/yum.repos.d/epel.repo yum install socat -y wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el6.noarch.rpm rpm -ivh rabbitmq-server-3.6.6-1.el6.noarch.rpm cd /etc/rabbitmq cp /usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example /etc/rabbitmq/ mv rabbitmq.config.example rabbitmq.config touch rabbitmq-env.conf cat >> rabbitmq-env.conf << eof RABBITMQ_LOG_BASE=/home/rabbitmq/log eof mkdir /home/rabbitmq/log -p chown rabbitmq.rabbitmq -R /home/rabbitmq /etc/init.d/rabbitmq-server start chkconfig rabbitmq-server on #Add user rabbitmqctl add_user admin admin #创建用户 rabbitmqctl set_user_tags admin administrator rabbitmq-plugins enable rabbitmq_management #开启管理界面 #rabbitmq.config文件 sed -i '64 d' rabbitmq.config sed '63 a {loopback_users, []},' -i rabbitmq.config sed '218 a{vm_memory_high_watermark, 0.9}' -i rabbitmq.config #内存设置 #rabbitmq数据是根据当前hostname作为node节点作为数据名保存、重启会丢失用户信息 echo 'NODENAME=rabbit@q' | sudo tee -a /etc/rabbitmq/rabbitmq-env.conf echo '127.0.0.1 q' | sudo tee -a /etc/hosts 查看rabbitmq的数据保存路径 cat /var/lib/rabbitmq/mnesia/
service rabbitmq-server restart 其它命令: rabbitmqctl list_users #查看用户信息 rabbitmqctl list_queues #显示队列 rabbitmqctl change_password API API123.. #修改用户API密码 rabbitmq配置 一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径: 一个是环境变量的配置文件 /etc/rabbitmq/rabbitmq-env.conf ; 一个是配置信息的配置文件 /etc/rabbitmq/rabbitmq.conf; 注意,这两个文件默认是没有的,如果需要必须自己创建。 管理web界面登陆 在浏览器中输入http://127.0.0.1:15672/ 输入用户名和密码(默认为guest)