RabbitMQ基本概念
如下图(来自百度百科),RabbitMQ是基于高级消息队列协议(AMQP)设计实现的消息中间件,主要包括的概念有交换机(Exchange)、消息队列(queue)、绑定(binding)、通道(channel)等。
下面基于AMQP协议的内容对上述概念进行总结,主要内容来自AMQP 0.9.1 Model Explained
交换机(Exchange)
接收消息后根据消息的路由键和队列的绑定(bingding),将消息路由到对应队列中,交换机类型主要包括:
- 直连(direct):拿到消息后根据路由键是否等于对应队列的绑定键,直接将消息路由到对应队列。
- 扇形(Fanout):将消息发送到当前交换机绑定的所有队列(广播路由)。
- 主题(topic):通过将消息路由键与队列绑定模式匹配,将消息转发到一个或者多个匹配成功的队列(多播路由)。
- 头(head):将路由键从字符串变为了多值属性,多值匹配实现路由。
一个消息中间件包含多个交换机,交换机可以为持久的或者临时的。
消息队列(Queue)
存储消息的一个FIFO队列,由客户端消费队列中的消息内容,队列包含一系列属性:
- Name:队列名
- Durable:是否持久化
- Exclusive:是否只有一个连接使用,连接关闭后即删除
- Auto-delete:随后一个消费者退订后即删除
客户端对于消息队列的消费方式可以分为主动(pull)和被动(push)两种方式,为了避免消息在成功消费前,在队列中删除,AMQP提供了两种确认建议:
- 消息发送给应用后立刻删除
- 需要收到应用的消费ACK消息后,才能够删除
当消息消费失败,队列会将消息重新添加到队列,投递给另外一个消费者消费,或者当前消费者的重新消费(不是很清晰)
绑定(Binding)
绑定是交换机根据消息路由键,将消息路由到的对应队列的”匹配规则“,根据交换机类型的不同、消息路由键的不同以及绑定规则的不同,一条消息可能发布给0-多个队列。
连接和通道(Channel)
AMQP是基于TCP可靠传输实现的应用层协议,每个客户端与消息中间件通过TCP长连接通信,为了避免一个客户端与中间件建立多个连接,引入了通道(Channel)的概念。
在一个TCP连接上建立多个相互隔离的通道,每个通道单独的实现消息的发布/消费。
不同通道消息带有不同的通道号,客户端通过通道号区分不同通道消息。
总结
在我看来AMQP像是一种”设计模式“,设计和规定了消息中间件的具体实现方式,但不涉及实现细节,RabbitMQ是按照AMQP协议设计实现的消息中间件系统,因此其整体上的架构和逻辑必定满足AMQP概念,只是可能实现细节上有所区别,在进一步学习中总结。
RabbitMQ安装
了解概念后的下一步就是安装实操,按照官网上Installing on RPM-based Linux安装教程主要有三种方式
使用Docker环境运行,快速测试RabbitMQ
1
2latest RabbitMQ 3.11
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management基于 Cloudsmith.io or PackageCloud的yum安装(官方推荐)
- 默认仓库的RabbitMq版本往往落后非常多
- RabbitMQ官方团队会将最新的RabbitMQ RPM包发布在 Cloudsmith.ior和PackageCloud
RPM包安装法
- 逐个下载对应的RPM包,使用
RPM
命令安装
- 逐个下载对应的RPM包,使用
RabbitMQ的依赖包有三个:
erlang
socat
logrotate
使用方法2安装
RPM安装较为简单,这里尝试一下方法2
配置PakageCloud仓库
- 或者可以直接在
/etc//etc/yum.repos.d
中添加新仓库的配置文件,添加对应配置
- 或者可以直接在
脚本执行结果(生成的配置文件命名有问题,需要按照手动修改配置)
更新本地源仓库,
--disablerepo
首先关闭所有仓库,--enablerepo
然后开启两个仓库1
yum -q makecache -y --disablerepo='*' --enablerepo='rabbitmq_erlang' --enablerepo='rabbitmq_server'
依次安装对应RPM包
安装
socat
和logrotate
包(使用默认源即可)1
yum install socat logrotate -y
安装
erlang
和rabbitmq-server
(使用替换后的新源)1
yum install --repo rabbitmq_erlang --repo rabbitmq_server erlang rabbitmq-server -y
可以看到已是最新版本的
rabbitmq
下载了一下午,下载总是超时,放弃了该方法
从Github上查找对应
RPM
包RabbitMQ和erlang的对应关系:RabbitMQ Erlang Version Requirements
使用RPM命令安装
前台启动查看是否安装成功
- 成功安装并启动
基本管理命令
设置自动启动
1 | chkconfig rabbitmq-server on |
以系统服务形式管理RabbitMQ服务(systemctl
同样可以)
1 | service rabbitmq-server start |
开启web管理页面插件,对应端口号为15672
1 | rabbitmq-plugins enable rabbitmq_management |
guest
用户只支持本机登录,需要创建用户: