乱七八糟的整理,建议全屏,否则排版可能会很奇怪~~
什么是RabbitMQ
RabbitMQ是一个开元的AMQP实现,服务端用ERlang语言编写,支持多种客户端。用于在分布式系统中存储转发纤细,在易用性、扩展性、高可用性等方面表现不俗
5672,5671
RabbitMQ的用户角色分类
none、management、policymaker、monitoring、administrator
用户:
none:
不能访问management plugin
management:查看和管理自己的信息
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues,exchange和bindings
查看和关闭自己的channels和connections
查看有关自己的cirtual hosts的“全局”的统计信息,包含其他用户在这些cirtual hosts中的活动
policymaker:
management基础上增加
查看、创建和删除自己的virtual hosts所属的policies和parameteres
monitoring:查看,监控
management基础上增加
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据入clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
administrator:管理员权限
policymaker和moniroeing基础上增加
创建和深处virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections
安装
erlang
https://github.com/rabbitmq/erlang-rpm/releases
yum install -y socat
启动:systemctl start rabbitmq-server
查看状态:systemctl status rabbitmq-server
停止服务:systemctl stop rabbitmq-server
开机自启:systemctl enable rabbitmq-server
开启插件:rabbitmq-plugins enable rabbitmq_management 说明:rabbitmq有个默认的guest用户,但只能通过localhost访问,所以需要添加用户够远程访问的用户
添加用户:rabbitmqctl add_user admin admin
为用户分配操作权限:rabbitmqctl set_user_tags admin administrator
为用户分配资源权限:rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
开放防火墙端口:firewall-cmd --zone=public --add-port=15672/tcp --permanent
AMQP协议
AMQP(Advanced Message Queueing Protocol)高级消息队列协议,是应用层协议的一个开放标准为面向消息的中间件设计
AMQP结构:
AMQP生产者流转过程:
-->rabbitmq如何发送消息
RabbitMQ中消息发送至Queue时先发送至Exchange(交换机)又Exchange发送至Queue,在Rabbit中一共有4种Exchange
发送消息时不指定Exchange默认使用Queue的名称直接匹配到对应的Queue,因为在消息发送时直接指定了Queue
Fanout Exchange: 队列绑定在Exchange上,当消息发送到交换机上时,Exchange把消息发送至所有绑定在自己身上的Queue
Direct Exchange: 队列绑定在Exchange上并指定BindKey,Exchange根据BindKey指定发送给符合匹配的Queue
Topic Exchange: 队列绑定在Exchange上并指定routing key,Exchange根据routing key指定发送给符合匹配的Queue,routing key可以使一个有通配的规则,假如routing key为“com.#”,那么所有以“com.”绑定在Exchange上的Queue都将会收到消息
Herders Exchange: 队列绑定在Exchange上并指定属性(例x=1),Exchange根据属性值指定发送给符合匹配的Queue --性能不高,不常用
运转流程:
高可用
集群安装:
在集群环境中,默认只同步元数据。假如两个实例做集群,node1中有数据,node2只同步元数据,数据存在node1中,消费者绑定了node2,
可以看到node2(node1)中的数据,也可以消费node2(node1)的数据。这样数据在一台服务器上会有单点故障问题,所以要做高可用方案
元数据包括:
队列元数据:队列的名称及属性
交换器:交换器的名称及属性
绑定关系元数据:交换器与队列或者交换器与交换器
vhost元数据:为vhost内的队列、交换器和绑定提供命名空间及安全属性之间的绑定关系
高可用方案:
镜像队列模式:不仅要同步对象的描述信息,也要同步数据
镜像队列模式配置:
可直接在控制台中配置:
在admin账户中选中Admin,选择Policies(策略)新增策略
选择该策略名称,应用范围(正则),类型(exchange或queue或全部),优先级(数字越大越高),同步的节点数(这条消息同步到几个节点,推荐三个)
配置完后点击add policy
持久化
rabbitmq的持久化分为:队列持久化、消息持久化和交换器持久化、不管是持久化的消息好事非持久化的消息都可以被写入到磁盘
队列持久化:
队列的持久化是在定义队列时的durable参数来实现的,durable为true时,队列才会持久化
Connection connection = connectionFactory.newConnection();
Channel channel = connection,createCHannel();
//第二个参数设置为true,即dutable=true
channel.queueDeclare("queue1",true,false,false,null);
在控制台中,持久化的队列在管理界面可以看到有个“D”的标识
消息持久化:
消息持久化通过消息的属性deliveryMode来设置是否持久化,在发送消息时通过basicPublish的参数传入
//通过传入MessageProperties.PERSISTENT_TEXT_PLAIN就可以实现消息持久化
channel.basicPublish("","queue1",MesdsageProperties.PERSISTENT_TEXT_PLAIN,"persistent_test_message".getBytes);
交换器持久化:
同队列一样,交换器也需要在定义时设置持久化标识,否则在Broker重启之后将丢失
//dutrtable为true则开启持久化
Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable) throes IOException;
内存控制
当内存使用超过配置的阈值或者磁盘剩余空间低于配置的阈值时,RabbitMq会暂时阻塞客户端的连接,并停止接收从客户端你发来的消息,
以此避免服务崩溃,客户端与服务端的心跳检测也会失效,当出现内存告警时,可以通过管理命令临时调整内存大小,默认内存阈值时0.4
当磁盘剩余空间低于确定的阈值时,RabbitMQ同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃,
默认情况下,磁盘阈值为50m,便是当磁盘剩余空间低于50m时会阻塞生产者并停止内存中消息的换页动作。一个相对谨慎的做法是将磁盘阈值设置为
操作系统锁显示的内存大小一致
内存换页:
假如rabbitmq最大占用内存为1000m,阈值为0.5,当存储的数据大小超过500m时,把内存中的500m数据持久化到磁盘上,释放内存空间
磁盘控制
与内存控制原理相同,内存分页之后的数据保存在磁盘上,当擦盘剩余空间低于预设的值时,磁盘预警
消息可靠性
RabbitM去的消息可靠性,一般是业务系统接入消息中间件是首要考虑的问题,一般通过三个方面保障
发送可靠性:确保消息成功发送到Broker
存储可靠性:Broker对消息持久化,确保消息不会丢失
消息可靠性:确保消息成功被消费
一般消息发送可靠性分为三个层级
1、At most once:最多一次,消息可能会丢失,但绝对不会重复传输
2、At lwast once:最少一次,消息绝对不会丢失,但可能会重复传输
3、Exactly ince:恰好一次,每条消息肯定会被传输一次且仅传输一次
RabbitMQ支持其中的“最多一次”和“最少一次”,使用中“最多一次”被抛弃,因为无法确定消息被发送至MQ中
其中"做少一次"投递实现需要考虑:
1、消息生产者需要开启事务机制或者publisher confirm机制,以确保消息可以可靠的传输到RabbitMQ中
2、消息生产者需要配合使用mandatory参数或者备份交换器来确保消息能够从交换器路由到队列中,进而能够保存下来而不会被丢弃
消息消费可靠性:
(x-dead-letter-exchange)死信队列:出现异常或超时的消息保存在死信队列上
插件机制
rabbitMQ控制台就属于插件。
通过插件可以扩展多种核心功能:支持多种协议、系统状态监控、其它AMQP 0-9-1交换类型、节点联合等。
许多功能都是通过插件实现的
查看插件列表:
rabbitmq-plugins list
启用/禁用插件
rabbitmq-plugins enable plugin-name
rabbitmq-plugins disable plugin-name