0%

RabbitMQ基本概念和安装

RabbitMQ基本概念

如下图(来自百度百科),RabbitMQ是基于高级消息队列协议(AMQP)设计实现的消息中间件,主要包括的概念有交换机(Exchange)、消息队列(queue)、绑定(binding)、通道(channel)等。

下面基于AMQP协议的内容对上述概念进行总结,主要内容来自AMQP 0.9.1 Model Explained

交换机(Exchange)

接收消息后根据消息的路由键和队列的绑定(bingding),将消息路由到对应队列中,交换机类型主要包括:

  1. 直连(direct):拿到消息后根据路由键是否等于对应队列的绑定键,直接将消息路由到对应队列。
  2. 扇形(Fanout):将消息发送到当前交换机绑定的所有队列(广播路由)。
  3. 主题(topic):通过将消息路由键与队列绑定模式匹配,将消息转发到一个或者多个匹配成功的队列(多播路由)。
  4. 头(head):将路由键从字符串变为了多值属性,多值匹配实现路由。

一个消息中间件包含多个交换机,交换机可以为持久的或者临时的。

消息队列(Queue)

存储消息的一个FIFO队列,由客户端消费队列中的消息内容,队列包含一系列属性:

  1. Name:队列名
  2. Durable:是否持久化
  3. Exclusive:是否只有一个连接使用,连接关闭后即删除
  4. Auto-delete:随后一个消费者退订后即删除

客户端对于消息队列的消费方式可以分为主动(pull)和被动(push)两种方式,为了避免消息在成功消费前,在队列中删除,AMQP提供了两种确认建议:

  1. 消息发送给应用后立刻删除
  2. 需要收到应用的消费ACK消息后,才能够删除

当消息消费失败,队列会将消息重新添加到队列,投递给另外一个消费者消费,或者当前消费者的重新消费(不是很清晰

绑定(Binding)

绑定是交换机根据消息路由键,将消息路由到的对应队列的”匹配规则“,根据交换机类型的不同、消息路由键的不同以及绑定规则的不同,一条消息可能发布给0-多个队列。

连接和通道(Channel)

AMQP是基于TCP可靠传输实现的应用层协议,每个客户端与消息中间件通过TCP长连接通信,为了避免一个客户端与中间件建立多个连接,引入了通道(Channel)的概念。

  • 在一个TCP连接上建立多个相互隔离的通道,每个通道单独的实现消息的发布/消费。

  • 不同通道消息带有不同的通道号,客户端通过通道号区分不同通道消息。

总结

在我看来AMQP像是一种”设计模式“,设计和规定了消息中间件的具体实现方式,但不涉及实现细节,RabbitMQ是按照AMQP协议设计实现的消息中间件系统,因此其整体上的架构和逻辑必定满足AMQP概念,只是可能实现细节上有所区别,在进一步学习中总结。

RabbitMQ安装

了解概念后的下一步就是安装实操,按照官网上Installing on RPM-based Linux安装教程主要有三种方式

  1. 使用Docker环境运行,快速测试RabbitMQ

    1
    2
    # latest RabbitMQ 3.11
    docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management
  2. 基于 Cloudsmith.io or PackageCloud的yum安装(官方推荐)

    • 默认仓库的RabbitMq版本往往落后非常多
    • RabbitMQ官方团队会将最新的RabbitMQ RPM包发布在 Cloudsmith.ior和PackageCloud
  3. RPM包安装法

    • 逐个下载对应的RPM包,使用RPM命令安装

RabbitMQ的依赖包有三个:

  1. erlang
  2. socat
  3. logrotate

使用方法2安装

RPM安装较为简单,这里尝试一下方法2

  1. 配置PakageCloud仓库

    • 或者可以直接在/etc//etc/yum.repos.d中添加新仓库的配置文件,添加对应配置
  • 脚本执行结果(生成的配置文件命名有问题,需要按照手动修改配置)

  • 更新本地源仓库,--disablerepo 首先关闭所有仓库,--enablerepo 然后开启两个仓库

    1
    yum -q makecache -y --disablerepo='*' --enablerepo='rabbitmq_erlang' --enablerepo='rabbitmq_server'
  1. 依次安装对应RPM包

    • 安装socatlogrotate包(使用默认源即可)

      1
      yum install socat logrotate -y
    • 安装erlangrabbitmq-server(使用替换后的新源)

      1
      yum install --repo rabbitmq_erlang --repo rabbitmq_server erlang rabbitmq-server -y
    • 可以看到已是最新版本的rabbitmq

    • 下载了一下午,下载总是超时,放弃了该方法

  2. 从Github上查找对应RPM

  3. 前台启动查看是否安装成功

    • 成功安装并启动

基本管理命令

设置自动启动

1
chkconfig rabbitmq-server on

以系统服务形式管理RabbitMQ服务(systemctl同样可以)

1
2
3
service rabbitmq-server start
service rabbitmq-server status
service rabbitmq-server stop

开启web管理页面插件,对应端口号为15672

1
rabbitmq-plugins enable rabbitmq_management

guest用户只支持本机登录,需要创建用户: