rabbitmq

前言

各种mq产品不统一,导致无法联合组成单一的总线,java程序只需要对JMS API编程,使用合适的MQ驱动,隐藏其中实际接口,但是单独化标准型接口胶合众多不同接口,会使JMS程序很脆弱。

AMQP标准 AMQP标准,建立一条TCP链接,创建N多条信道,发送AMQP命令,减少tcp开销

AMQP消息路由过程 交换器,队列和绑定,生产者把消息发布到交换器上,绑定决定如何从路由器到达队列,队列中消息被消费者消费。

AMQP命令 basic.consume,将信道置为接受模式,直到取消订阅。 basic.get 向队列请求单条数据

rabbitmq特定

交换器,队列和绑定

交换器类型

消息持久化

运行管理rabbit erlang虚拟机简称节点,多个erlang程序可以运行在同一个节点,节点之间可以通信。

启动rabbitmq以及整个erlang节点 安装目录./sbin运行./rabbitmq-server, /var/log/rabbitmq/下查看日志, ./sbin/rabbitmqctl stop 停止 rabbitmq rabbitmq中队列,交换器和绑定原数据都是保存到minesia(内建erlang非sql型数据库) dump_log_write_threshold,日志文件转储真实数据库文件额度

权限 读:有关消费消息任何操作,清除整个队列 写:发布消息 配置:队列,交换器创建和删除 rabbitmqctl set_permissions -p /vhost1 user_admin ‘.’ ‘.’ ‘.*’

检查 rabbit编码和模式 解耦:

  1. 异步状态,分离请求和动作
  2. 提供扩展性
  3. 零成本api(消息通信)

发后即忘模型:

rabbitmq实现RPC等待响应,私有队列和发送确认 AMQP有reply_to,生产者通过该字段可确认队列,并监听队列等待应答

rabbitmq集群:运行消费者和生产者rabbit节点奔溃情况下继续运行,通过添加更多节点来线性扩展消息通信吞吐量。

rabbitmq会记录以下四种类型内部元数据

队列 集群中不是每一个节点都有所有队列完全拷贝,其中一个节点挂掉,该节点关联的队列和绑定都会消失,其中没有持久化的队列会被消费者重新声明创建,持久化的队列只有等待重启

rabbitmq不将队列内容和状态复制到所有节点原因

  1. 存储空间
  2. 性能 消息发布需要将消息复制到每一个节点,持久化消息会触发磁盘活动

交换器 交换器不过是一张查询表,创建新的交换器不过是将查询表添加到集群所有节点上,集群中每个节点拥有每个交换器所有信息,节点故障时,只需生产者 重新连接到集群上,而发出过程未到达队列中时的消息通过confirm模式确保消息不丢失

注意 单节点系统只允许磁盘类型的节点; 集群中要求至少有一个磁盘节点,当磁盘节点挂了时,集群可以继续路由消息,但是不能:创建队列 创建交换器 创建绑定 添加用户 更改权限 添加或删除节点 添加内存节点时确保告知其所有磁盘节点,以便内存节点能在重启时重新加入集群(如果内存节点重启时,磁盘节点宕机,就比较麻烦了)

实操

一条服务器设置节点

rabbitmqctl -n rabbit_1@hostname stop_app 停止第二个节点

rabbitmqctl -n rabbit_1@hostname rest 第二个节点重设元数据

rabbitmqctl -n rabbit_1@hostname cluster rabbit@hostname\rabbit_1@hostname 准备加入并获取第一个节点元数据,并将其第二个节点的作为磁盘节点

rabbitmqctl -n rabbit_1@hostname start_app 重启第二个节点成为集群中的一员

多台服务器设置节点 需要将erlang cookie(/var/lib/rabbitmq/.erlang.cookie)复制到其他几个节点,以便erlang节点集群互相认证

reset 指令重设节点,与集群中磁盘节点通信,告诉节点正离开集群。离开后节点检查状态会发现是独立的,其他节点检查状态发现移除节点已不在

升级集群节点 rabbitmq management 指令备份当前配置,关闭所有生产者,等待消费者完成所有消息,关闭节点,解压最小rabbitmq在磁盘节点,启动磁盘节点,启动其他内存节点

镜像队列处理路由消息到合适的队列,也要将消息投递到镜像队列中拷贝

warren和sovel:故障转移和复制 warren是指一对主/备独立服务器

web管理rabbitmq rabbitmq-plugins enable rabbitmq_management –启用插件

默认用户guest 只允许localhost登录。

(1)超级管理员(administrator)

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2) 监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

(3) 策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

与administrator的对比,administrator能看到这些内容

(4) 普通管理者(management)

使用rest api控制rabbitmq curl -i -u yaterrsmq:123456 http:localhost:15672/api/queues/host/queue –curl手工发送和接手HTTP请求查看host虚拟机队列queue的数据统计 可支持post,put,delete

/api/connections –查看当前链接列表和详情 /api/all-configuration –下载或者上传完整的rabbitmq服务器配置,队列,交换器和绑定 /api/nodes –列出集群中所有节点 /api/users/ --创建或者查看rabbitmq用户 /api/vhosts/ --查看或者创建虚拟主机 /api/permissions// --为用户设置权限

Rabbitmq监控

消息投递流程 此处输入图片的描述

当声明队列的时候,rabbitmq会像不同的mnesia表添加多条记录,如声明队列durable rabbit_queue和rabbit_durable_queue 添加记录 此处输入图片的描述

不同的队列声明配置,交换器声明配置,交换器类型都会影响表记录的创建,影响内存的消耗

到服务器的新连接4,创建新的信道4,队列声明1 都会产生进程数 2的20次方时erlang的上限