Docker下RabbitMQ延时队列实战两部曲之一:极速体验

简介: 向RabbitMQ发出消息后,有时我们希望消费方不要立即消费,这时候延时队列就派上用场了,本篇就来快速体验其效果

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

关于延时队列

  • 有的应用场景中,向RabbitMQ发出消息后,我们希望消费方不要立即消费,可以通过延时队列来实现,思路是将消息发送到A队列,此队列没有消费者,等消息过期后会进入A队列的Dead Letter Exchange中,B队列绑定了这个Dead Letter Exchange,消费方只要消费B队列的消息,就能实现延时消费了,如下图所示:

image.png

延时的时长

  • 从上面的描述可以看出,延时时长就是消息的过期时间TTL(Time To Live),这个参数可以通过以下两种方式设置:
  1. 生产消息时,设置该消息的TTL;
  2. 设置整个队列的TTL,队列中每个消息的TTL都是一样的;
  • 接下来的实战,我们将上述两种方式都体验一次;

环境信息

  1. 操作系统:Ubuntu 16.04.3 LTS
  2. Docker:1.12.6
  3. RabbitMQ:3.7.5-rc.1

极速体验

  • 本章是《Docker下RabbitMQ延时队列实战两部曲》系列的第一篇,重点是极速体验,先看一下即将体验的整体结构图:

image.png

  • 简单说一下上图中应用的身份:
  1. delayrabbitmqconsumer:SpringBoot框架的应用,连接RabbitMQ的两个队列,消费消息;
  2. messagettlproducer:SpringBoot框架的应用,收到web请求后向RabbitMQ发送消息,消息中带有过期时间(TTL);
  3. queuettlproducer:SpringBoot框架的应用,收到web请求后向RabbitMQ发送消息,消息中不带过期时间(TTL),但是对应的消息队列已经设置了过期时间;
  • 开始实战:
  • 确保当前电脑上Docker可用,创建docker-compose.yml文件,内容如下:
version: '2'
services:
  rabbit1:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit1
    ports:
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=888888
  rabbit2:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit2
    depends_on:
      - rabbit1
    links:
      - rabbit1
    environment:
     - CLUSTERED=true
     - CLUSTER_WITH=rabbit1
     - RAM_NODE=true
     - HA_ENABLE=true
    ports:
      - "15673:15672"
  rabbit3:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit3
    depends_on:
      - rabbit2
    links:
      - rabbit1
      - rabbit2
    environment:
      - CLUSTERED=true
      - CLUSTER_WITH=rabbit1
    ports:
      - "15675:15672"
  messagettlproducer:
    image: bolingcavalry/messagettlproducer:0.0.1-SNAPSHOT
    hostname: messagettlproducer
    depends_on:
      - rabbit3
    links:
      - rabbit1:rabbitmqhost1
      - rabbit2:rabbitmqhost2
      - rabbit3:rabbitmqhost3
    ports:
      - "18080:8080"
    environment:
      - mq.rabbit.address=rabbitmqhost1:5672,rabbitmqhost2:5672,rabbitmqhost3:5672
      - mq.rabbit.username=admin
      - mq.rabbit.password=888888
      - message.ttl.exchange=message.ttl.exchange
      - message.ttl.queue.source=message.ttl.queue.source
      - message.ttl.queue.process=message.ttl.queue.process
  queuettlproducer:
    image: bolingcavalry/queuettlproducer:0.0.1-SNAPSHOT
    hostname: queuettlproducer
    depends_on:
      - messagettlproducer
    links:
      - rabbit1:rabbitmqhost1
      - rabbit2:rabbitmqhost2
      - rabbit3:rabbitmqhost3
    ports:
      - "18081:8080"
    environment:
      - mq.rabbit.address=rabbitmqhost1:5672,rabbitmqhost2:5672,rabbitmqhost3:5672
      - mq.rabbit.username=admin
      - mq.rabbit.password=888888
      - queue.ttl.exchange=queue.ttl.exchange
      - queue.ttl.queue.source=queue.ttl.queue.source
      - queue.ttl.queue.process=queue.ttl.queue.process
      - queue.ttl.value=5000
  delayrabbitmqconsumer:
    image: bolingcavalry/delayrabbitmqconsumer:0.0.1-SNAPSHOT
    hostname: delayrabbitmqconsumer
    depends_on:
      - queuettlproducer
    links:
      - rabbit1:rabbitmqhost1
      - rabbit2:rabbitmqhost2
      - rabbit3:rabbitmqhost3
    environment:
     - mq.rabbit.address=rabbitmqhost1:5672,rabbitmqhost2:5672,rabbitmqhost3:5672
     - mq.rabbit.username=admin
     - mq.rabbit.password=888888
     - message.ttl.queue.process=message.ttl.queue.process
     - queue.ttl.queue.process=queue.ttl.queue.process
  • 在docker-compose.yml文件所在目录执行命令docker-compose up -d,docker会先去下载镜像,然后创建多个容器,请静候启动完成,如下:
root@willzhao-Vostro-3267:/usr/local/work/github/blog_demos/rabbitmq_docker_files/delaymq# docker-compose up -d
Creating network "delaymq_default" with the default driver
Creating delaymq_rabbit1_1 ... done
Creating delaymq_rabbit2_1 ... done
Creating delaymq_rabbit3_1 ... done
Creating delaymq_messagettlproducer_1 ... done
Creating delaymq_queuettlproducer_1   ... done
Creating delaymq_delayrabbitmqconsumer_1 ... done
  • 一共启动了5个容器,将他们的名称和作用列举到下面表格中:
名称 作用 备注
delaymq_rabbit1_1 一号RabbitMQ 管理页面:192.168.31.102:15672
delaymq_rabbit2_1 二号RabbitMQ 管理页面:192.168.31.102:15673
delaymq_rabbit3_1 三号RabbitMQ 管理页面:192.168.31.102:15675
delaymq_messagettlproducer_1 消息生产者 每条消息中都带了TTL
delaymq_queuettlproducer_1 消息生产者 消息中不带TTL,消息队列设置了TTL
delaymq_delayrabbitmqconsumer_1 消息消费者 同时消费上述两个队列的消息
  • 我的电脑IP地址是192.168.31.102,因此在浏览器输入:http://:192.168.31.102:15672 ,可以进入RabbitMQ的登录页面,如下图:

image.png

  • 登录用户名:admin,密码:888888,登录后页面如下图,可以见到RabbitMQ集群已经就绪:

image.png

  • 如果您的页面中的三个RabbitMQ还没有完全就绪(绿色状态),建议稍等几分钟后再刷新页面;
  • 我的电脑IP地址是192.168.31.102,因此在浏览器输入:http://192.168.31.102:18080/messagettl/aaa/bbb/3 ,即可向delaymq_messagettlproducer_1容器发起一次请求,容器会发送一条带有TTL的消息,然后页面提示发送成功,如下图:

image.png

  • 在浏览器输入:http://192.168.31.102:18081/queuettl/ccc/ddd ,即可向delaymq_queuettlproducer_1容器发起一次请求,容器会向一个已经设置了TTL的队列发送一条消息,然后页面提示发送成功,如下图:

image.png

  • 再次进入RabbitMQ管理页面http://:192.168.31.102:15672 ,查看队列情况如下图,已经有四个队列了:

image.png

  • 用下列表格对上述四个队列简单说明:
名称 作用 备注
message.ttl.queue.source 生产者发送消息到此 这里面的消息都带有TTL
message.ttl.queue.process Dead Letter Exchange将过期消息转发到此 这里都是message.ttl.queue.source的过期消息
queue.ttl.queue.source 生产者发送消息到此 这里面的消息都不带TTL,这个队列自己有TTL
queue.ttl.queue.process Dead Letter Exchange将过期消息转发到此 这里都是queue.ttl.queue.source的过期消息
  • 容器delaymq_delayrabbitmqconsumer_1中的tomcat在启动时候,由于此时队列还没创建,因此无法连接队列,会导致tomcat启动失败,进而导致容器退出(因为tomcat进程占据了控制台,它退出容器就会退出),此时请执行docker restart delaymq_delayrabbitmqconsumer_1重启容器;
  • 重启后,执行命令docker logs -f delaymq_delayrabbitmqconsumer_1,开始实时打印消费者容器的日志,可以看到SpringBoot刚刚启动就把之前的两条消息给消费了,如下图红框所示:

image.png

  • 在浏览器输入:http://192.168.31.102:18080/messagettl/aaa01/bbb01/10 ,url中的10表示延时十秒,去看delaymq_delayrabbitmqconsumer_1的日志,果然,10秒钟后日志才会打印出来,如下所示,消息中的时间和日志的时间戳相差10秒:
2018-06-09 07:13:25.878  INFO 1 --- [cTaskExecutor-1] c.b.d.receiver.MessageTtlReceiver        : receive message : hello, aaa01 , bbb01, from queue [message.ttl.queue.source], delay 10's, 2018-06-09 07:13:15
  • 在浏览器输入:http://192.168.31.102:18081/queuettl/ccc01/ddd01 ,会发送消息到队列queue.ttl.queue.source,这个队列的TTL是5秒,在delaymq_delayrabbitmqconsumer_1的日志中可以看见发起和收到时间正好差5秒,如下:
2018-06-09 07:31:05.101  INFO 1 --- [cTaskExecutor-1] c.b.d.receiver.QueueTtlReceiver          : receive message : hello, ccc01 , ddd01, from queue [queue.ttl.queue.source], 2018-06-09 07:31:00
  • 至此,咱们的极速体验延时队列实战就结束了,接下来的章节,我们一起实战详细的开发过程《Docker下RabbitMQ延时队列实战两部曲之二:细说开发》

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
11月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
903 52
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
3252 1
|
供应链 测试技术 开发者
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
就这样,你成功地用魔法召唤出了RabbitMQ,还把它和你的应用程序连接了起来。现在,消息会像小溪流水一样,在你的系统中自由流淌。别忘了,兔子们不喜欢孤独,他们需要你细心的关怀,不时地监控它们,确保他们的世界运转得井井有条。
844 18
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
910 3
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
785 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ