项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
31| 消息队列RabbitMQ回顾和容器化安装部署
2024-08-14
·
·
原创
·
·
本文共 388个字,预计阅读需要 2分钟。
### 基于Linux服务器安装RabbitMQ容器化部署 - 阿里云安装RabbitMQ:最少 2核4g或者推荐 2核8g - Docker安装RabbitMQ:https://hub.docker.com/_/rabbitmq/ ```shell #拉取镜像 docker pull rabbitmq:latest docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:latest ``` 介绍 > - -d 以守护进程方式在后台运行 > - -p 15672:15672 management 界面管理访问端口 > - -p 5672:5672 amqp 访问端口 > - --name:指定容器名 > - --hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中 > > -e 参数 > RABBITMQ_DEFAULT_USER 用户名 > RABBITMQ_DEFAULT_PASS 密码 主要端口介绍 - 4369 erlang 发现端口口 - 5672 client 端通信口 - 15672 管理界面 ui 端口 - 25672 server 间内部通信口 启动web客户端 方法一:进入容器开启 >**进入rabbitmq容器** >docker exec -it 容器名/容器id /bin/bash >开启web客户端 >rabbitmq-plugins enable rabbitmq_management 方法二:不进入容器开启 >docker exec -it 容器名/容器id rabbitmq-plugins enable rabbitmq_management 访问管理界面 - ip:15672 - 注意事项: Linux服务器检查防火墙是否关闭;云服务器检查网络安全组是否开放端口 ```sh #CentOS 7 以上默认使用的是firewall作为防火墙 #查看防火墙状态 firewall-cmd --state #停止firewall systemctl stop firewalld.service #禁止firewall开机启动 systemctl disable firewalld.service ``` ### 延迟队列核心知识之RabbitMQ死信队列 + TTL回顾 什么是TTL - time to live 消息存活时间 - 如果消息在存活时间内未被消费,则会别清除 - RabbitMQ支持两种ttl设置 - 单独消息进行配置ttl - 整个队列进行配置ttl(居多) - 什么是rabbitmq的死信队列 - 没有被及时消费的消息存放的队列 - 什么是rabbitmq的死信交换机 - Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另一个交换机,这个交换机就是DLX死信交换机。 - 消息有哪几种情况成为死信 - 消费者拒收消息**(basic.reject/ basic.nack)**,并且没有重新入队 **requeue=false** - 消息在队列中未被消费,且超过队列或者消息本身的过期时间**TTL(time-to-live)** - 队列的消息长度达到极限 - 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列 ### RabbitMQ 延迟队列介绍和应用场景回顾 - 什么是延迟队列 - 一种带有延迟功能的消息队列,Producer 将消息发送到消息队列 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息 - 使用场景 - 通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息 - 用户登录之后5分钟给用户做分类推送、用户多少天未登录给用户做召回推送; - 消息生产和消费有时间窗口要求:比如在天猫电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条 延时消息。这条消息将会在 30 分钟以后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。 如支付未完成,则关闭订单。如已完成支付则忽略 - Cloud微服务大课训练营里面的应用 - 优惠券回收 - 商品库存回收 - 业界的一些实现方式 - 定时任务高精度轮训 - 采用RocketMQ自带延迟消息功能 - RabbitMQ本身是不支持延迟队列的,怎么办? - 结合死信队列的特性,就可以做到延迟消息 - 操作 * 消息生产 - 投递到普通的topic交换机 - 消息过期,进入死信交换机 * 消息消费 - 消费者监听死信交换机的队列 ![image-20210115165003935](https://file.xdclass.net/note/2021/rabbitmq/img/image-20210115165003935.png) ### SpringCloudAlibaba微服务整合RabbitMQ依赖和配置 什么是Spring-AMQP - 官网:https://spring.io/projects/spring-amqp - Spring 框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO的消息监听等 - 提供不依赖于任何特定的AMQP代理实现或客户端库通用的抽象,最终用户代码将很容易实现更易替换、添加和删除AMQP,因为它可以只针对抽象层来开发 - 总之就是提高我们的框架整合消息队列的效率,SpringBoot为更方便开发RabbitMQ推出了starter, - 我们使用 spring-boot-starter-amqp 进行开发 common项目添加依赖 ```xml
org.springframework.boot
spring-boot-starter-amqp
``` * 各个微服务添加配置 ```yaml #消息队列 rabbitmq: host: 8.129.113.233 port: 5672 virtual-host: / password: password username: admin #开启手动确认消息 listener: simple: acknowledge-mode: manual ``` * 其他自定义配置后续添加