Broker 收到这个消息后,如果判断到 TIMER_DELIVER_MS 这个属性有值,就会把这个消息投递到 Topic 是 rmq_sys_wheel_timer 的队列中,queueId 是 0,同时会保存原始消息的 Topic、queueId、投递时间(TIMER_OUT_MS)。 TimerMessageStore 中有个定时任务 TimerEnqueueGetService 会从 rmq_sys_wheel_timer 这个 Topic ...
Broker 收到这个消息后,如果判断到 TIMER_DELIVER_MS 这个属性有值,就会把这个消息投递到 Topic 是 rmq_sys_wheel_timer 的队列中,queueId 是 0,同时会保存原始消息的 Topic、queueId、投递时间(TIMER_OUT_MS)。 TimerMessageStore 中有个定时任务 TimerEnqueueGetService 会从 rmq_sys_wheel_timer 这个 Topic ...
TimerWheel中的每个槽位都可以保存一个指向TimerLog中某个元素的索引,TimerLog中的元素又保存它前一个元素的索引。也就是说,TimerLog呈链表结构,存储着TimerWheel对应槽位时间窗所要投递的所有定时消息。 2.2.2 定时消息轮转:避免定时消息被老化删除 为了防止定时消息在投递之前就被老化删除,能想到的办法主要是两个:...
TimerWheel(org.apache.rocketmq.store.timer.TimerWheel):时间轮结构,是一个环,由一系列Slot组成,逻辑上因为延迟消息的生产时间是随机的,因此不连续,对应一个物理二进制文件,例如:/var/folders/_m/sx5bwyvj6z577f3vzk8pw4lc0000gn/T/unitteststore-4b570306-1d9a-4c49-9f07-486249fd2187 slotsTotal:轮盘的...
message.setDeliverTimeMs(System.currentTimeMillis() + 10_000L); // 发送消息 SendResult result = producer.send(message); 2. 概要设计 2.1 任意时间定时消息的难点 任意时间定时消息的实现存在一定的难点,所以 4.x 才会实现 18 个延迟等级的定时消息,作为一个折衷的方案。
computeDeliverTimestamp 根据延迟消息级别和消息的存储时间计算该延迟消息的投递时间 publiclongcomputeDeliverTimestamp(finalintdelayLevel,finallongstoreTimestamp){Longtime=this.delayLevelTable.get(delayLevel);if(time !=null) {returntime + storeTimestamp; ...
// 消息未达到投递时间,安排下次定时任务,N ms后执行 ScheduleMessageService.this.timer.schedule( new DeliverDelayedMessageTimerTask(this.delayLevel, nextOffset), countdown); // 更新进度 ScheduleMessageService.this.updateOffset(this.delayLevel, nextOffset); ...
社区的实现是每一个延迟级别设置一个timer施行,如果级别特别多,那cpu占用会特别高,甚至大到影响服务...
定时任务的实现类DeliverDelayedMessageTimerTask,核心方法是executeOnTimeup publicvoid executeOnTimeup() {//根据延迟级别获取该延迟队列信息ConsumeQueue cq = ScheduleMessageService.this.defaultMessageStore.findConsumeQueue(SCHEDULE_TOPIC, delayLevel2QueueId(delayLevel)); ...
会有一个调度任务不停地拉取这些延时消息,ScheduleMessageService的load()方法会加载一个delayLevelTable(ConcurrentHashMap类型),key保存延时级别(从1开始),value保存延时时间(单位是 ms);load()方法结束后,创建了一个有18个核心线程的定时线程池,然后遍历delayLevelTable,创建18个任务(DeliverDelayedMessageTimerTask)...