RabbitMQ 概述及注意
RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
RabbitMQ 服务器是用 Erlang 语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
总结:RabbitMQ 实现了 AMQP 协议来构建自己的消息队列
RabbitMQ 是 Erlang 语言写的,但是我们有操作 RabbitMQ 的 java 的驱动
面试问题: Activemq 和 RabbitMq 的区别
根本的区别:Activemq 他实现的是 JMS 协议(Java 消息协议)
RabbitMQ 实现的是 AMQP 协议(高级消息队列协议)
Activemq : 是 Java 写的
RabbitMQ : Erlang 写的: 吞吐更多,延时更低!
MQ的特点
1. 异步处理:
消息发送者可以发送一个消息而无需等待响应。消息发送者把消息发送到一条虚拟的通道(主题或队列)上;
消息接收者则订阅或监听该通道。一条信息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。整个过程都是异步的。
2. 解耦服务:
发送者和接收者不必了解对方,只需要确认消息。发送者和接收者不必同时在线。
3. 流量削峰:
设置流程缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮。
MQ的大致流程
发送者把消息发给消息服务器,消息服务器把消息存放在若干队列/主题中,在合适的时候,消息服务器会把消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,发送者和接受者的生命周期也没有必然关系在发布 pub/订阅 sub 模式下,也可以完成一对多的通信,可以让一个消息有多个接受者[微信订阅号就是这样的]。
MQ的安装
下载Erlang的rpm包
RabbitMQ是Erlang语言编写,所以Erang环境必须要有,注:Erlang环境一定要与RabbitMQ版本匹配。
https://www.rabbitmq.com/which-erlang.html
下载socat的rpm包
rabbitmq安装依赖于socat,所以需要下载socat。
socat下载地址:http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
下载RabbitMQ的rpm包
RabbitMQ下载地址:https://www.rabbitmq.com/download.html(根据自身需求及匹配关系,下载对应rpm包)rabbitmq-server-3.8.1-1.el7.noarch.rpm
安装Erlang、Socat、RabbitMQ
一般都是吧压缩吧放到 /opt/rabbitmq下
①rpm -ivh erlang-21.3.8.9-1.el7.x86_64.rpm
②rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm
在安装rabbitmq之前需要先安装socat,否则,报错。
可以采用yum安装方式:yum install socat,我们这里采用rpm安装方式
③rpm -ivh rabbitmq-server-3.8.1-1.el7.noarch.rpm
/usr/lib/rabbitmq/bin/
启用管理插件
rabbitmq-plugins enable rabbitmq_management
修改主机名
vim /etc/hostname
vim /etc/hosts
启动RabbitMQ
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service
systemctl restart rabbitmq-server.service
systemctl stop rabbitmq-server.service
创建新的用户
测试
在本地输入虚拟机ip:15672
RabbitMQ的端口号
端口 | 作用 |
---|---|
5672 | 客户端连接端口号 |
25672 | 集群 |
15672 | 后台管理系统 |
改成 / 虚拟主机
RabbitMQ的五种模式
发布订阅模式、路由模式、通配符模式,三种模式都使用交换机
交换机的类型
Fanout:广播、将消息交给所有绑定到交换机的队列(用在发布订阅模式)
Direct:定向、把消息交给符合指定 routing key 的队列(用在路由模式)
Topic :通配符、把消息交给符合 routing pattern (路由模式)的队列(用在通配符模式)
通配符规则
#:匹配零个或多个词
*:匹配1个词
RabbitMQ高级特性
消息的可靠投递
消息的发送方希望杜绝任何消息丢失或者投递失败。RabbitMQ提供了两种方式来控制消息的投递可靠性模式。
- confirm 确认模式
- return 退回模式
rabbitmq 整个消息投递的路径为:
producer—>rabbitmq broker—>exchange—>queue—>consumer
l消息从 producer 到 exchange 则会返回一个 confirmCallback 。
l消息从 exchange–>queue 投递失败则会返回一个 returnCallback 。
Consumer Ack
ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。
有二种确认方式:
自动确认:acknowledge=“none” 默认
手动确认:acknowledge=“manual”
其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。
如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。