RabbitMQ
- RabbitMQ是一个开源消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据;基于AMQP协议,使用Erlang语言编写
优点
- 采用Erlang语言作为底层实现:Erlang有着和原生Socket一样的延迟
- 开源、性能优秀、稳定保障
- 提供可靠性消息投递模式、返回模式
- 与SpringAMQP完美整合、API丰富
- 集群模式丰富,表达式配置,HA模式,镜像队列模型
- 保证数据不丢失的前提做到高可用
AMQP
- 定义:是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
- Server:又称Broker,接受客户端的连接,实现AMQP实体服务
- Connection:连接,应用程序与Broker的网络连接
- Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息的读写通道.客户端可连接多个Channel,每个Channel代表一个会话任务
- Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,Body是消息体的内容
- Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个Virtual host里面可以有若干个Exchange和Queue,同一个Virtual host里面不能有相同名称的Exchange或Queen
- Exchange:交换机,接收消息,根据路由建转发消息到绑定队列
- Biding:Exchange和Queue之间的虚拟连接,biding中可以包含routing key
- Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息
- Queue:也称为Message Queen,消息队列,保存消息并将它们转发给消费者
集群架构
- 主备模式:实现rabbitmq的高可用集群,适合并发和数据量不高,好用简单,主备模式也称之为Warren模式
- 远程模式:实现双活的一种模式,简称shovel模式,即将消息进行不同数据中心的复制工作,跨地域的让两个mq集群互联
- 镜像模式:保证100%数据不会丢失,实际工作中也是用的最多的.实现简单
- 多活模式:实现异地数据复制的主流模式;这种模型依赖RabbitMQ的federation插件,可以实现持续的可靠的AMQP数据通信
- Federation插件是一个不需要构建Cluster,而在Brokers之间传输消息的高性能插件
- Federation Exchanges,可以看成Downstream从Upstream主动拉取消息,但并不是拉取所有消息,必须是在Downstream上已经明确定义Bindings关系的Exchange
安装
- 安装依赖
yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel
- 下载安装包
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm
- 安装
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
- 修改用户登录与连接心跳检测
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app # loopback_users 中的 <<"guest">>,只保留guest(用于用户登录) # heartbeat 为10(用于心跳连接)
- 安装管理插件
# 首先启动服务(后面|包含了停止查看状态以及重启的命令) /etc/init.d/rabbitmq-server start | stop | status | restart # 查看服务有没有启动: lsof -i:5672(5672是Rabbit的默认端口) rabbitmq-plugins enable rabbitmq_management # 查看管理端口有没有启动 lsof -i:15672 或者 netstat -tnlp | grep 15672 # 浏览器访问用户名密码均为guest ip+端口15672
与Spring Boot整合
- 引入maven依赖
- Application.properties
- 生产端核心配置
spring.rabbitmq.publisher-confirms=true
,spring.rabbitmq.publisher-returns=true
,spring.rabbitmq.template.mandatory=true
- 消费端配置
spring.rabbitmq.listener.simple.acknowledge-mode=MANUAL
,spring.rabbitmq.listener.simple.concurrency=1
,spring.rabbitmq.listener.simple.max-concurrency=5
- 生产端核心配置