• shan
    2023-09-16 来自河南
    总结 延时消息一般先将数据写入到一个临时存储,然后根据一定的机制在消息到期后让消费者可以消费到消息,主要有两个实现思路: 1. 定时任务检测:一般有独立的线程去判断数据是否到期,如果数据到期将数据取出写入到实际的Topic中,这个方案实现简单,不过在延迟消息量大的情况下到期时间可能不精准; 2. 消费时判断数据是否可见:每次消费时判断是否有到期的延时消息,虽然省去了定时线程的检测逻辑,但是每次都需要去判断是否有消息到期,可能会出现性能问题。 通常采用方案1实现延迟消息。 定时检测技术方案 1. 基于轮询检测机制的实现:由定时任务定时去检测有没有消息到期。 2. 基于时间轮机制:构建多级时间轮,再每个刻度上挂载需要处理的延时消息索引列表,依赖时间轮的推进,获取到要处理的延时消息列表,思路与方案1相似,不过有以下几个优点: (1)插入和获取的时间复杂度都是O(1); (2)可以支持任意时间精度的延时消息; (3)可以支持任何时长的延时消息; (4)每个时间刻度都可以支持任意多的元素; RocketMQ延时消息实现(基于轮询检测机制实现) RocketMQ对消息可以设置延迟级别,每个级别对应一个延迟时间,RocketMQ定义了一个延迟消息专用的主题SCHEDULE_TOPIC_XXXX,当发送延迟消息时,会将消息先存入到SCHEDULE_TOPIC_XXXX这个主题,每个延迟级别对应一个消息队列,一般会把相同延迟级别的消息投递到同一个消息队列中,每个延迟级别都有一个对应的定时任务定时检测这些延迟消息队列,有消息到期时会将消息取出,再投递到消息原本所属的Topic中,以此实现延迟消息。
    展开
    
    