前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker下RabbitMQ延时队列实战两部曲之一:极速体验

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

作者头像
程序员欣宸
发布2022-05-09 09:17:59
2820
发布2022-05-09 09:17:59
举报
文章被收录于专栏:实战docker实战docker

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

这里写图片描述
这里写图片描述

原文地址:https://blog.csdn.net/boling_cavalry/article/details/80630100

延时的时长

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

接下来的实战,我们将上述两种方式都体验一次;

环境信息

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

极速体验

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

这里写图片描述
这里写图片描述

简单说一下上图中应用的身份: 1. delayrabbitmqconsumer:SpringBoot框架的应用,连接RabbitMQ的两个队列,消费消息; 2. messagettlproducer:SpringBoot框架的应用,收到web请求后向RabbitMQ发送消息,消息中带有过期时间(TTL); 3. queuettlproducer:SpringBoot框架的应用,收到web请求后向RabbitMQ发送消息,消息中不带过期时间(TTL),但是对应的消息队列已经设置了过期时间;

开始实战:

  1. 确保当前电脑上Docker可用,创建docker-compose.yml文件,内容如下:
代码语言:javascript
复制
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

2. 在docker-compose.yml文件所在目录执行命令docker-compose up -d,docker会先去下载镜像,然后创建多个容器,请静候启动完成,如下:

代码语言:javascript
复制
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

3. 一共启动了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

消息消费者

同时消费上述两个队列的消息

4. 我的电脑IP地址是192.168.31.102,因此在浏览器输入:http://:192.168.31.102:15672,可以进入RabbitMQ的登录页面,如下图:

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

9. 用下列表格对上述四个队列简单说明:

名称

作用

备注

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的过期消息

10. 容器delaymq_delayrabbitmqconsumer_1中的tomcat在启动时候,由于此时队列还没创建,因此无法连接队列,会导致tomcat启动失败,进而导致容器退出(因为tomcat进程占据了控制台,它退出容器就会退出),此时请执行docker restart delaymq_delayrabbitmqconsumer_1重启容器; 11. 重启后,执行命令docker logs -f delaymq_delayrabbitmqconsumer_1,开始实时打印消费者容器的日志,可以看到SpringBoot刚刚启动就把之前的两条消息给消费了,如下图红框所示:

这里写图片描述
这里写图片描述

12. 在浏览器输入:http://192.168.31.102:18080/messagettl/aaa01/bbb01/10,url中的10表示延时十秒,去看delaymq_delayrabbitmqconsumer_1的日志,果然,10秒钟后日志才会打印出来,如下所示,消息中的时间和日志的时间戳相差10秒:

代码语言:javascript
复制
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

13. 在浏览器输入:http://192.168.31.102:18081/queuettl/ccc01/ddd01,会发送消息到队列queue.ttl.queue.source,这个队列的TTL是5秒,在delaymq_delayrabbitmqconsumer_1的日志中可以看见发起和收到时间正好差5秒,如下:

代码语言:javascript
复制
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延时队列实战两部曲之二:细说开发》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 延时的时长
  • 环境信息
  • 极速体验
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档