概述

  • RabbitMQ 是一个消息中间件:它接收并转发消息。
  • 我们可以将 RabbitMQ 当做是一个快递站点,当我们要发送一个包裹的时候,我们可以将包裹送到快递站(目前,也支持上门取件),快递员最终会把快递送到收件人哪里,按照这种逻辑 RabbitMQ 是一个快递站。
  • RabbitMQ 和快递站的主要区别在于:RabbitMQ 不处理快件而是接收、存储和转发消息数据

四大核心概念

  1. 生产者:产生数据发送消息的程序。

  2. 交换机:交换机是 RabbitMQ 中非常重要的一个组件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,或者将消息丢失,这是由交换机的类型决定的。

  3. 队列:队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但是它们只能存储在队列中。队列仅仅受到主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列中接收数据。

  4. 消费者:消费者就是等待接收消息的程序。

注意:
① 生产者、消费者以及消息中间件很多时候并不在同一台机器上。
② 同一个应用程序既可以是生产者也可以是消费者。

RabbitMQ 的工作模式

RabbitMQ 的工作原理

  • Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker 。
  • Virtual Host:出于多租户和安全因素的设计,将 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 的概念。当多个不同的用户使用同一个 RabbitMQ Server 提供服务的时候,可以划分多个 vhost ,每个用户在自己的 vhost 创建 exchange 、queue 等。
  • Connection:生产者、消费者和 MQ 之间的 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 中。
  • Queue:消息最终存放的地方,以便消费者进行消费。
  • Binding:Exchange 和 Queue 之间的虚拟连接,binding 中可以包含 routing key ,Binding 信息被保存在 Exchange 的查询表中,用于 message 的分发依据。

安装RabbitMQ

安装 Erlang

  • 下载

    1
    wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-22.3.1-1.el7.x86_64.rpm/download.rpm
  • 安装

    1
    rpm -ivh erlang-22.3.1-1.el7.x86_64.rpm

安装 RabbitMQ

  • 下载安装包

    1
    wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-3.8.8-1.el7.noarch.rpm
  • 安装依赖:

    1
    yum -y install socat
  • 安装:

    1
    rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
  • 开启管理界面:

    1
    rabbitmq-plugins enable rabbitmq_management

配置

  • 配置远程可以使用 guest 登录 RabbitMQ

    1
    2
    # vim /etc/rabbitmq/rabbitmq.conf
    loopback_users = none
  • 启动 RabbitMQ :

    1
    2
    3
    4
    systemctl start rabbitmq-server
    systemctl enable rabbitmq-server
    systemctl stop firewalld
    systemctl disable firewalld

访问

添加用户

  • 添加用户:

    1
    rabbitmqctl add_user admin 123456
  • 设置角色:

    1
    rabbitmqctl set_user_tags admin administrator
  • 赋予权限:

    1
    rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
  • 查看当前系统中的用户:

    1
    rabbitmqctl list_users