目录
2.1 生产者-消费者模式(Producer-Consumer Model)
2.2 发布-订阅模式(Publish-Subscribe Model)
1. 消息队列是什么
消息队列(Message Queue, MQ)是一种在分布式系统中用来实现异步通信的机制。它允许独立的应用程序或服务通过传递消息进行交互,而不必彼此直接连接或实时等待。这种松耦合设计能够提高系统的可扩展性和可靠性。
作用:
- 解耦:通过消息队列,生产者和消费者之间的直接依赖减少,它们可以独立地开发、扩展和维护。例如,订单处理系统中,用户下单后,订单信息发送到消息队列,后台服务异步处理支付、库存等操作。
- 异步处理:消息队列允许生产者将消息放入队列后立即返回,消费者可以在稍后的时间点处理消息。这种异步特性对于需要立即响应用户请求但实际处理过程较为复杂的场景非常有用。
- 削峰填谷:在流量高峰时,消息队列可以缓冲大量请求,平衡系统负载,避免瞬时过载。例如,在电商促销活动中,消息队列可以处理瞬时激增的订单请求。
- 可靠传输:消息队列能够确保消息在网络或服务不稳定的情况下不会丢失。通过持久化、确认机制,消息可以被可靠地传输并处理。
常见应用场景:
- 订单处理:电商系统中,用户下单时,订单信息被发送到消息队列,然后由后台服务异步处理。
- 日志处理:应用程序将日志数据发送到队列中,由日志系统异步收集、存储和分析。
- 任务调度:定时任务或延时任务可以通过消息队列进行调度,例如邮件发送、定时推送通知等。
2.消息队列的模型
消息队列可以采用多种模型来适应不同的应用场景,每种模型都有其独特的机制和优点。
2.1 生产者-消费者模式(Producer-Consumer Model)
模型描述:
- 生产者将消息发送到队列中。
- 消费者从队列中取出并处理消息。
- 该模式通常用于将任务分配给多个消费者进行并行处理,达到负载均衡的效果。
应用场景:
- 电商系统中订单的异步处理,生产者生成订单,消费者处理支付和发货等任务。
- 日志收集系统,生产者产生日志,消费者存储和分析日志。
2.2 发布-订阅模式(Publish-Subscribe Model)
模型描述:
- 生产者将消息发送到一个主题(Topic)或交换机(Exchange)。
- 订阅了该主题或绑定到该交换机的所有消费者都可以接收到消息。
- 适用于需要广播消息给多个订阅者的场景。
应用场景:
- 事件通知系统,生产者发布事件消息,多个消费者订阅并处理这些事件。
- 新闻推送服务,发布者发送新闻消息,订阅了该主题的所有用户都会收到推送。
2.3 路由模式(Routing Model)
模型描述:
- 生产者将消息发送到带有路由键(Routing Key)的交换机。
- 交换机根据路由键将消息分发到相应的队列。
- 这种模型适用于需要根据条件进行消息路由的场景。
应用场景:
- 日志服务,根据日志级别(如
error
、info
)将日志路由到不同的日志处理队列。 - 消息分发系统,根据消息类型(如
订单
、支付
)将消息路由到不同的处理模块。
3.安装与配置:使用 Docker 安装 RabbitMQ
3.1获取 RabbitMQ Docker 镜像
docker pull rabbitmq:3.12-management
执行结果:
3.12-management: Pulling from library/rabbitmq
857cc8cb19c0: Pull complete
e3a5ef18aca7: Pull complete
0abd7306e75f: Pull complete
30a2e9f54765: Pull complete
01e644b03cf2: Pull complete
666538278b45: Pull complete
eaf505186101: Pull complete
081588784980: Pull complete
983238bf2549: Pull complete
0ba577b32df1: Pull complete
Digest: sha256:0986bf7b67da3eae88678c0b9dee9c608c537e35744d777590026d56fe0aa746
Status: Downloaded newer image for rabbitmq:3.12-management
docker.io/library/rabbitmq:3.12-management
3.2创建并运行
docker run -d -p 15672:15672 -p 5672:5672 \
--restart=always \
-e RABBITMQ_DEFAULT_VHOST=all \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
--hostname rabbitmq \
--name rabbitmq-3.1.2\
rabbitmq:3.12-management
执行结果
# docker运行容器ID
f0422705069a4f986b45493d942012b1241429882bae207c404a2a7d1e0edc3f
3.3开启RabbitMQ控台
docker exec -it 容器名称或容器ID /bin/bash
执行结果
# 此时便可执行rabbit 相关指令
root@rabbitmq:/#
root@rabbitmq:/#
root@rabbitmq:/# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@rabbitmq:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_prometheus
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@rabbitmq...
Plugin configuration unchanged.
也可使用简单的方式启用
docker exec -it 容器名称/容器id rabbitmq-plugins enable rabbitmq_management
3.3访问 RabbitMQ 管理界面
Web页面便可以访问我们的控制台 ip:port,密码为我们自己设置的admin/123456,如果使用腾讯云则需要则安全策略中开放映射的端口
4.RabbitMQ 的核心概念
4.1交换机(Exchange)
- 定义:交换机接收来自生产者的消息,并根据特定的路由规则将消息分发到一个或多个队列中。
- 类型:
- Direct Exchange:根据消息的路由键精确匹配,将消息发送到对应的队列。
- Fanout Exchange:将消息广播到所有绑定到该交换机的队列,不考虑路由键。
- Topic Exchange:根据路由键的模式匹配,将消息发送到符合条件的队列。
- Headers Exchange:根据消息的头部属性进行路由,而不是依赖路由键。
4.2队列(Queue)
- 定义:队列是 RabbitMQ 中存储消息的缓冲区,消费者可以从队列中获取消息。
- 特性:
- 持久化队列:当 RabbitMQ 服务器重启时,持久化队列中的消息不会丢失。
- 非持久化队列:消息仅存在于内存中,服务器重启时会丢失。
- 独占队列:只能由一个消费者使用,一旦消费者断开连接,队列就会被删除。
- 自动删除队列:当最后一个消费者断开连接时,队列会自动删除。
4.3绑定(Binding)
- 定义:绑定将交换机和队列连接起来,并指定消息如何从交换机路由到队列。绑定可以带有路由键或条件。
- 作用:决定消息从交换机到达哪个队列。
4.4路由键(Routing Key)
- 定义:路由键是生产者在发送消息时附带的一个字符串,用于指定消息的路由规则。
- 作用:帮助交换机根据路由键将消息定向到正确的队列。在
Direct Exchange
中,路由键必须精确匹配。在Topic Exchange
中,路由键可以是模式匹配。
总结
RabbitMQ 是一个功能强大的消息代理系统,适用于多种分布式应用场景。通过理解 RabbitMQ 的架构和核心概念,如交换机、队列、绑定和路由键,开发者可以设计出灵活、可靠的消息传递系统。使用 Docker 安装 RabbitMQ 可以快速进行测试和部署。