IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> RabbitMQ延时队列 -> 正文阅读

[大数据]RabbitMQ延时队列

应用场景:饿了么下订单,若没有支付,会显示个支付倒计时,若倒计时结束,还没支付,则该消息会被送入延时队列处理
两种实现方式:1.基于参数TTL(可以在消息设置或者在队列设置),并绑定到对应的死信交换机 2.使用插件,获得一个有延迟功能的Direct交换机
两种实现方式的区别:

基于TTL的实现

在消息中设置延时

在这里插入图片描述

 //死信消息 设置TTL时间
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
channel.channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",propertis,message.getBytes());

在队列中设置延时

放入QA中消息经过10s后会被通过绑定的死信交换机Y,送入死信队列(延迟队列)中。至于没有过期的消息如何处理,尚未可知。
在这里插入图片描述

//声明队列 B ttl 为 40s 并绑定到对应的死信交换机
@Bean("queueB")
public Queue queueB(){
   Map<String, Object> args = new HashMap<>(3);
   //声明当前队列绑定的死信交换机
   args.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
   //声明当前队列的死信路由 key
   args.put("x-dead-letter-routing-key", "YD");
   //声明队列的 TTL
   args.put("x-message-ttl", 40000);
   return QueueBuilder.durable(QUEUE_B).withArguments(args).build();
}

这种情况,如果要设置1h,2h,3h延时的队列就需要分别创建对应的队列,很麻烦

基于插件的实现

通过安装延时插件,可以获得一个有延时功能的Direct交换机,生产者P发布的消息(设置了延时)会被放入该交换机,等待过期之后,送入绑定的延时队列中,由C消费。至于没有过期的消息如何处理,尚未可知。

在这里插入图片描述

@Configuration
public class DelayedQueueConfig {
    public static final String DELAYED_QUEUE_NAME = "delayed.queue";
    public static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";
    public static final String DELAYED_ROUTING_KEY = "delayed.routingkey";
    @Bean
    public Queue delayedQueue() {
      return new Queue(DELAYED_QUEUE_NAME);
    }
    //自定义交换机 我们在这里定义的是一个延迟交换机
    @Bean
    public CustomExchange delayedExchange() { 
      Map<String, Object> args = new HashMap<>();
      //自定义交换机的类型
      args.put("x-delayed-type", "direct");
      return new CustomExchange(DELAYED_EXCHANGE_NAME, "x-delayed-message", true, false,args);
     }
    @Bean
    public Binding bindingDelayedQueue(@Qualifier("delayedQueue") Queue queue, @Qualifier("delayedExchange") CustomExchange delayedExchange) {
     return BindingBuilder.bind(queue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs();
     } 
}

问题

基于设置TTL的方式,消息是放在队列中的,如果前置消息没有被消费的话,后面的消息就不会被消费,也就是说,如果第一个消息设置延时20s,第二个消息设置延时2s,则因为第一个消息迟迟没有被处理,等到它过期,第二个消息早就过期了,故实际情况不应采用这种方式,所以应该采取基于插件的方式

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:08:54  更:2021-07-26 12:10:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 5:22:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码