跳转到内容

RabbitMQ 安装及内部消息分发机制

Ken 码农
  • 中间件
  • 消息队列
  • RabbitMQ

RabbitMQ 是一个开源的AMQP实现,服务器端使用Erlang语言编写,支持多种客户端。用于再分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现优异。


基于Centos 7安装

erlang的版本需要与RabbitMQ的版本匹配

参考 https://github.com/rabbitmq/rabbitmq-server/blob/main/docs/compatibility.json

参考 https://www.rabbitmq.com/docs/which-erlang

参考 https://www.rabbitmq.com/docs/install-rpm

RabbitMQ的配置文件位于/etc/rabbitmq/rabbitmq.conf,没有就需要创建touch /etc/rabbitmq/rabbitmq.conf

参考 https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/docs/rabbitmq.conf.example

参考 https://www.rabbitmq.com/docs/configure#config-items

RabbitMQ会绑定一些端口,安装完后需要将这些端口添加至防火墙放行;如果使用的云服务器需要在对应云服务器厂商控制台添加安全组的放行规则。

两个端口时后面的端口是用于SSL/TLS的端口

端口描述
4369是Erlang的端口/节点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用
5672,5671正常使用的端口,平时我们连接的基本是5672端口,AMQP 0-9-1和1.0客户端端口,没有使用SSL(5672)和使用SSL(5671)的端口
15672HTTP_API端口,管理员用户才能访问,用于管理RabbitMQ,需要启用management插件,一个Web控制台。
25672用于RabbitMQ节点间和CLI工具通信,配合4369使用
61613,61614当STOMP插件启用时打开,作为STMOMP客户端端口(根据是否使用TLS选择)
1883,8883当MQTT插件启用时打开,作为MQTT客户端端口(根据是否使用TLS选择)
15674基于WebSocket的STOMP客户端端口(当插件Web STOMP启用的时候打开)
15675基于WebScoket的MQTT客户端端口(当插件Web MQTT启用的时候打开)
25671当MQTT插件启用时打开,作为MQTT客户端端口(根据是否使用TLS选择)
Terminal window
rabbitmq-plus enable rabbitmq_management

RabbitMQ有一个默认的用户guest,密码为guest,只能通过本地访问,不能远程访问。 远程访问需要创建一个新用户,并分配权限。

Terminal window
# 创建一个新用户
rabbitmqctl add_user admin password
# 为用户分配权限
rabbitmqctl set_user_tags admin administrator
# 为用户分配资源权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

RabbitMQ有以下几种角色:

  • none、management、policymaker、monitoring、administrator
  • 不能访问management plugin

用户可以通过AMQP做的任何事,外加:

  • 列出自己可以用AMQP登入的vhosts
  • 查看自己的vhosts中的queues、exchanges和bindings
  • 查看和关闭自己的channels和connections
  • 查看有关自己的vhosts的“全局”的统计信息,包含其他用户在这些vhosts中的活动。

包括management角色的所有权限,再加上:

  • 查看、创建和删除自己的vhosts所属的policies和parameters

包括management角色的所有权限,再加上:

  • 列出所有vhosts,包括他们不能登录的vhosts
  • 查看其他用户的connections和channels
  • 查看节点级别的数据(如clustering和memory使用情况)
  • 查看真正关于所有vhosts的全局的统计信息

包括policymaker和monitoring可以做的任何事外加:

  • 创建和删除vhosts
  • 查看、创建和删除users
  • 查看创建和删除permissions
  • 关闭其他用户的connections

RabbitMQ有以下几种权限:

  • 资源权限:拥有对资源的访问权限
  • 操作权限:拥有对操作的访问权限

AMQP(Advanced Message Queuing Protocol)是一种消息队列协议,是一种基于TCP/IP协议的二进制协议,用于在应用程序之间传递消息。

  • Module Layer:模块层,位于最高层,主要定义供客户端调用的命令,客户端可基于这些命令实现自身的业务逻辑。
  • Session Layer:会话层,位于中间层,负责把客户端命令发往服务端、把应答带回客户端,为两端通信提供同步与错误处理等能力。
  • Transport Layer:传输层,位于最低层,传输二进制数据流,承担帧处理、信道复用、错误检测与数据表示等职责。

客户端与 RabbitMQ Broker 之间先建立 connection(TCP 连接),再在连接上打开若干 channel(信道)进行协议交互;Broker 内按 虚拟主机 划分命名空间,其下挂载 队列 等资源。下图用白板形式归纳这一结构(图中 Broker 地址仅为示例)。

seqdiag diagram

seqdiag diagram