1、安装与启动rabbitmq
首先,rabbitmq需使用centos7及以上版本进行安装!安装依赖环境:
yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
下载erlang,socat和rabbitmq的安装包导入虚拟机(自己百度去找吧),安装erlang:
rpm -ivh erlang安装包名称,如果gblic版本过低也会报警,处理方法如下:
安装依赖:sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlitedevel readline-devel tk-devel gcc make -y
下载rpm包:wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm & wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepoel6/epel-6-x86_64/glibc-2.17-55.fc20/nscd-2.17-55.el6.x86_64.rpm &
安装rpm包:sudo rpm -Uvh socat-1.7.3.2-1.1.el7.x86_64.rpm --force --nodeps
查看版本:strings /lib64/libc.so.6 | grep GLIBC,2.15以上即可。
安装socat:rpm -ivh socat安装包名 --force --nodeps
安装rabbitmq:rpm -ivh rabbitmq安装包名
安装完成后开启rabbitmq管理页面:rabbitmq-plugins enable rabbitmq_management,
修改默认配置信息:vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app,注意loopback_users中的用户名和密码。启动rabbitmq:service rabbitmq-server start。在外部访问虚拟机15672端口就可以看见rabbitmq控制台,用户名密码使用默认的guest。
2、rabbitmq工作模式
RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由 模式,Topics主题模式,RPC远程调用模式。
简单模式:简单模式主要有一个“消费者”、一个“生产者”和一个“消息队列”构成,由生产者提供请求消息,储存在消息队列中,然后消费者从消息队列中取出消息进行处理,由于篇幅原因不展示代码了,这是官方api文档https://www.rabbitmq.com/getstarted.html。
work模式:相比简单模式有多个消费者一同处理消息队列中的请求消息,其他和简单模式一样。
订阅模式:订阅模式具有一个“生产者”,一个“交换机”,多个“消息队列”和多个“消费者”,相较于前面的两个模式,生产者不在直接将请求消息直接发送给消息队列,而是发送给交换机,由交换机来将请求消息发送给所有消息队列接受。
路由模式:路由模式与订阅模式差不多,只不过是交换机通过每一个请求消息绑定的令牌来确定该请求消息应该发送给哪一个消息队列接受。
Topics模式:与路由模式相似,只是将路由模式的令牌格式由单一字符串改为“字符串”.“字符串”的通配符模式,规则如下:
# :匹配一个或多个词
* :只能匹配1个词
举例: item.# :能够匹配 item.insert.abc 或者 item.insert item.* :只能匹配 item.insert。
3、rabbitmq特性
在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我 们提供了两种方式用来控制消息的投递可靠性模式:
confirm 确认模式
return 退回模式
rabbitmq 整个消息投递的路径为: producer--->rabbitmq broker--->exchange--->queue--->consumer 消息从 producer 到 exchange 则会返回一个 confirmCallback 。 消息从 exchange-->queue 投递失败则会返回一个 returnCallback 。 我们将利用这两个 callback 控制消息的可靠性投递。
当消费者接受消息时,rabbitmq提供了三种确认方式来让消费者确认消息的可靠性:
自动确认:acknowledge="none"
手动确认:acknowledge="manual"
根据异常情况确认:acknowledge="auto"
其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么 该消息就会丢失。如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。利用手动确认效果,可以设置消费者的每次最大处理消息数量,比方说我们服务器每次最多处理500个请求,但是突然有1000个请求来访问,那么可以利用手动确认机制来限制消费者从消息队列获取消息的数量,保证服务器不出现异常。那么当多个消息都在消息队列中等待时,不可能让一个消息永远在队列中等待,rabbitmq提供了强制过期的方法:在rabbitmq控制台中,添加消息队列时,在Arguments中添加一个x-message-ttl值,单位为毫秒,这样当一个消息在消息队列中放置超时后,该消息会成为“死信”。
所有“死信”消息需要一个专门处理死信消息的消息队列和消费者,消息称为死信的几种情况:1. 队列消息长度到达限制
2. 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false
3. 原队列存在消息过期设置,消息到达超时时间未被消费
在消息队列中设置属性x-dead-letter-exchange 和 x-dead-letter-routing-key,表示死信处理交换机和对应的令牌,在发送给特定的消费者来执行相应操作。



