RocketMQ延迟消息简明介绍

 更新时间:2022年08月22日 17:11:22   作者:π大星的日常  
这篇文章主要介绍了RocketMQ延迟消息,延迟消息是个啥?顾名思义,就是等一段时间再消费的消息。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

场景可以是这样的,双11抢手机,一个新手机4000-5000,到0点的时候,冲着兴奋劲,抢到了。但是摸了摸钱包,又冷静下来了,好像不是很必要换手机。就放在那里没有支付,过了30分钟,自动取消了。这里就是使用延迟消息的场景,当下单之后,向消息队列发送一条延迟30分钟消费的消息。等到30分钟过了,然后消费消息,执行检查任务,要是对应的订单支付了,就什么都不做,要是没支付,就取消订单。

RocketMQ的延迟消息是org.apache.rocketmq.broker.schedule.ScheduleMessageService类实现的

核心属性

RMQ_SYS_SCHEDULE_TOPIC

在之前的版本中叫SCHEDULE_TOPIC,是系统内置的Topic,用来保存所有的定时消息。没有执行的定时消息都会被保存在这个topic中。

FIRST_DELAY_TIME

第一次执行定时任务的延迟时间,默认是1秒。

private static final long FIRST_DELAY_TIME = 1000L;

DELAY_FOR_A_WHILE

第二次以及之后每次定时任务执行的间隔时间,默认100ms。

private static final long DELAY_FOR_A_WHILE = 100L;

DELAY_FOR_A_PERIOD

若是延迟消息投递失败,则在这个时间过后继续投递,默认10秒。

private static final long DELAY_FOR_A_PERIOD = 10000L;

delayLevelTable

这是保存延迟级别和延迟时间映射关系的地方

private final ConcurrentMap<Integer /* level */, Long/* delay timeMillis */> delayLevelTable =
    new ConcurrentHashMap<Integer, Long>(32);

offsetTable

保存延迟级别和对应的消费位点

private final ConcurrentMap<Integer /* level */, Long/* offset */> offsetTable =
    new ConcurrentHashMap<Integer, Long>(32);

核心方法

queueId2DelayLevel

将queueId转换为延迟级别

public static int queueId2DelayLevel(final int queueId) {
    return queueId + 1;
}

delayLevel2QueueId

将延迟级别转换为queueId

public static int delayLevel2QueueId(final int delayLevel) {
    return delayLevel - 1;
}

updateOffset

更新延迟消息topic的消费位点

private void updateOffset(int delayLevel, long offset) {
    this.offsetTable.put(delayLevel, offset);
    if (versionChangeCounter.incrementAndGet() % brokerController.getBrokerConfig().getDelayOffsetUpdateVersionStep() == 0) {
        long stateMachineVersion = brokerController.getMessageStore() != null ? brokerController.getMessageStore().getStateMachineVersion() : 0;
        dataVersion.nextVersion(stateMachineVersion);
    }
}

computeDeliverTimestamp

根据延迟消息级别和消息的存储时间计算该延迟消息的投递时间

public long computeDeliverTimestamp(final int delayLevel, final long storeTimestamp) {
    Long time = this.delayLevelTable.get(delayLevel);
    if (time != null) {
        return time + storeTimestamp;
    }
    return storeTimestamp + 1000;
}

start()

启动延迟消息服务

shutdown()

关闭start方法中启动的额timer任务

load()

加载消息的消费位点信息和全部的延迟级别信息。延迟级别信息默认如下。

private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";

parseDelayLevel

格式化所有的延迟级别信息,保存到内存中。

到此这篇关于RocketMQ延迟消息简明介绍的文章就介绍到这了,更多相关RocketMQ延迟消息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 三种简单排序算法(使用java实现)

    三种简单排序算法(使用java实现)

    下面小编就为大家带来一篇三种简单排序算法(使用java实现)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Java Unsafe创建对象的方法实现

    Java Unsafe创建对象的方法实现

    Java中使用Unsafe实例化对象是一项十分有趣而且强大的功能,本文主要介绍了Java Unsafe创建对象的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 举例讲解Java中final关键字的用法

    举例讲解Java中final关键字的用法

    Java中的final关键字可以被用来修饰变量、方法和类等,意味着终结、不可改变,下面我们就来举例讲解Java中final关键字的用法:
    2016-06-06
  • 比较Java数组和各种List的性能小结

    比较Java数组和各种List的性能小结

    这篇文章主要是分别对Java数组、ArrayList、LinkedList和Vector进行随机访问和迭代等操作,并比较这种集合的性能。有需要的可以参考借鉴。
    2016-08-08
  • Struts2实现多文件上传功能

    Struts2实现多文件上传功能

    这篇文章主要为大家详细介绍了Struts2实现多文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 利用MyBatis实现条件查询的方法汇总

    利用MyBatis实现条件查询的方法汇总

    这篇文章主要给大家介绍了关于利用MyBatis实现条件查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • Java中char[]输出不是内存地址的原因详解

    Java中char[]输出不是内存地址的原因详解

    这篇文章主要介绍了关于Java中char[]输出为什么不是内存地址的原因,文中通过示例代码介绍的很详细,需要的朋友们可以参考学习。
    2017-03-03
  • Java中的注解机制Annotation详解

    Java中的注解机制Annotation详解

    这篇文章主要介绍了Java中的注解机制Annotation详解,  Java Annotation 是 Java 语言中的一种 元数据机制,它可以在代码中添加额外的信息,以便于程序的理解和处理,Annotation 可以用来描述类、方法、属性等各种程序的特性,需要的朋友可以参考下
    2023-10-10
  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    浅谈mybatis中SQL语句给boolean类型赋值问题

    这篇文章主要介绍了浅谈mybatis中SQL语句给boolean类型赋值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 深入了解Java线程池的原理和监控

    深入了解Java线程池的原理和监控

    这篇文章主要介绍了深入了解Java线程池的原理和监控,创建Java线程需要给线程分配堆栈内存以及初始化内存,还需要进行系统调用,频繁地创建和销毁线程会大大降低系统的运行效率,这时候就要用到线程池,需要的朋友可以参考下
    2023-07-07

最新评论