RabbitMQ
本文最后更新于:2023年12月5日 晚上
阿里云消息队列:https://www.aliyun.com/product/ons
RabbitMQ 基于 erlang 语言开发,具有高并发优点、支持分布式具有消息确认机制、消息持久化机制,消息可靠性和集群可靠性高,简单易用、运行稳定、跨平台、多语言开源
Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念,当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:publisher/consumer 和 broker 之间的 TCP 连接。
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销。
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
Queue:消息最终被送到这里等待 consumer 取走,先进先出,可以持久化到磁盘节点服务器
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。
RabbitMQ 中的生产者消费者示例
生产者发送消息到 broker server(RabbitMQ),在 Broker 内部,用户创建 Exchange/Queue,通过 Binding 规则将两者联系在一起,Exchange 分发消息,根据类型/binding 的不同分发策略有区别,消息最后来到 Queue 中,等待消费者取走
RabbitMQ 单机部署
快速部署示例:https://www.rabbitmq.com/install-debian.html#apt-bintray-quick-start
主机名解析
时间原因,选择 apt 安装,直接执行以下脚本
安装成功
插件管理
https://www.rabbitmq.com/management.html
开启 web 管理界面使用账号 ljk,密码 123456,成功登录 web 管理界面:
登录之后,我们很少进行更改,主要是查看 rabbitmq 的运行状态
RabbitMQ 集群部署
- 普通模式:创建好 RabbitMQ 集群之后的默认模式
所有的 mq 节点保存相同的元数据,即消息队列,但队列里的数据仅保存一份,消费者从 A 节点拉取消息,如果消息在 B 节点,那么 B 会将消息发送给 A 节点,然后消费者就能拉取到数据了
缺点:单点失败 - 镜像模式:把需要的队列做成镜像队列
在普通模式的基础上,增加一些镜像策略,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,解决了单点失败的问题,但是性能下降,增加集群内部网络消耗一个
队列想做成镜像队列,需要先设置 policy,然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集群模式或镜像队列
推荐设计架构:
在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式(数据保存到内存和磁盘),其它节点使用内存模式(数据只保存到内存),使用磁盘模式的节点,作为数据备份使用
Ubuntu 1804 安装集群版 RabbitMQ
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信
各节点安装 RabbitMQ 并安装插件,参考上面单机部署
各服务器关闭 RabbitMQ
在 mq1 同步.erlang.cookie 至其他两台服务器
各服务器启动 RabbitMQ
查看当前集群状态
创建 RabbitMQ 集群:mq1、mq2 作为内存节点,mq3 作为磁盘节点
将集群设置为镜像模式,任意节点执行以下命令
查看集群状态
RabbitMQ 常用命令
创建 vhost
列出所有 vhost
列出所有队列
删除指定 vhost
添加账户 jack 密码为 123456
更改用户密码
设置 jack 用户对 test 的 vhost 有读写权限,三个点为配置正则、读和写