自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

說(shuō)說(shuō)MQ延遲隊(duì)列實(shí)現(xiàn)原理?

開(kāi)發(fā) 架構(gòu)
延遲隊(duì)列(Delay Queue)是一種特殊類(lèi)型的隊(duì)列,它的主要特點(diǎn)是可以讓進(jìn)入隊(duì)列的元素在指定的延遲時(shí)間之后才被取出進(jìn)行處理。

使用 RabbitMQ 和 RocketMQ 的人是幸運(yùn)的,因?yàn)檫@兩個(gè) MQ 自身提供了延遲隊(duì)列的實(shí)現(xiàn),不像用 Kafka 的同學(xué)那么苦逼,還要自己實(shí)現(xiàn)延遲隊(duì)列。當(dāng)然,這都是題外話,今天咱們重點(diǎn)來(lái)聊聊 RabbitMQ 延遲隊(duì)列的實(shí)現(xiàn)原理,以及 RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的優(yōu)缺點(diǎn)有哪些?

很多人知道使用 RabbitMQ 是可以實(shí)現(xiàn)延遲隊(duì)列的,但對(duì)于 RocketMQ 自身也提供了延遲隊(duì)列這件事卻持有不同態(tài)度,這是因?yàn)榫W(wǎng)上有些資料說(shuō) RocketMQ 和 Kafka 沒(méi)有內(nèi)置延遲隊(duì)列。其實(shí)這種說(shuō)法是因?yàn)?,RocketMQ 在早期版本中確實(shí)沒(méi)有內(nèi)置延遲隊(duì)列,但在 4.x 就內(nèi)置了 18 個(gè)級(jí)別的延遲隊(duì)列了(最長(zhǎng)支持 2 小時(shí)的延遲隊(duì)列),5.x 就支持隨機(jī)延遲時(shí)間的延遲隊(duì)列了,所以這里需要特殊強(qiáng)調(diào)一下。

1.什么是延遲隊(duì)列?

延遲隊(duì)列(Delay Queue)是一種特殊類(lèi)型的隊(duì)列,它的主要特點(diǎn)是可以讓進(jìn)入隊(duì)列的元素在指定的延遲時(shí)間之后才被取出進(jìn)行處理。

延遲隊(duì)列的主要使用場(chǎng)景有以下這些:

  • 訂單超時(shí)處理:在電商系統(tǒng)中,如果用戶下單后未在一定時(shí)間內(nèi)支付,訂單可能會(huì)被自動(dòng)取消??梢詫⒂唵畏湃胙舆t隊(duì)列,在設(shè)定的延遲時(shí)間(如 30 分鐘)后取出處理取消操作。
  • 任務(wù)重試:當(dāng)某個(gè)任務(wù)執(zhí)行失敗時(shí),將其放入延遲隊(duì)列,等待一段時(shí)間(如 5 分鐘)后重新執(zhí)行。
  • 消息延遲發(fā)送:某些消息不需要立即發(fā)送,而是在指定的延遲時(shí)間后發(fā)送,例如定時(shí)提醒消息。
  • 緩存過(guò)期處理:緩存中的數(shù)據(jù)可能有一定的有效期,將即將過(guò)期的數(shù)據(jù)放入延遲隊(duì)列,到期后進(jìn)行刪除或更新操作。

2.延遲任務(wù)實(shí)現(xiàn)方法

那么延遲隊(duì)列的實(shí)現(xiàn)方式有哪些呢?

延遲隊(duì)列的實(shí)現(xiàn)方式通常有以下幾種:

  • 基于 JDK 提供的 DelayQueue 來(lái)實(shí)現(xiàn):它是內(nèi)存級(jí)別的延遲隊(duì)列,重啟應(yīng)用之后消息會(huì)丟失,并且只支持單機(jī)版延遲隊(duì)列,所以一般不用。
  • 基于 MQ 的延遲隊(duì)列:例如使用 RabbitMQ 來(lái)實(shí)現(xiàn)延遲隊(duì)列,他們適合處理動(dòng)態(tài)和臨時(shí)延遲任務(wù),不像定時(shí)任務(wù)一樣,適合處理正式的、固定的延遲任務(wù)。
  • 基于定時(shí)任務(wù)組件實(shí)現(xiàn)延遲任務(wù):例如 XXLJob 或 Quartz 等框架來(lái)實(shí)現(xiàn)延遲任務(wù),他們適合處理固定(執(zhí)行)頻率的延遲任務(wù)。

我們通常會(huì)使用延遲隊(duì)列來(lái)存儲(chǔ)(和實(shí)現(xiàn))延遲消息,所以大部分時(shí)候,我們說(shuō)的延遲隊(duì)列和延遲消息其實(shí)是一回事。

3.使用RabbitMQ實(shí)現(xiàn)延遲隊(duì)列

使用 RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列有以下兩種實(shí)現(xiàn)方式:

  • 通過(guò)死信隊(duì)列實(shí)現(xiàn)延遲任務(wù):將正常的消息放到?jīng)]有消息訂閱者的消息隊(duì)列(消息自然就會(huì)過(guò)期),等消息過(guò)期之后會(huì)進(jìn)入死信隊(duì)列,通過(guò)訂閱死信隊(duì)列消費(fèi)消息,從而實(shí)現(xiàn)延遲隊(duì)列,如下圖所示:

  • 通過(guò)官方提供的延遲插件實(shí)現(xiàn)延遲功能。

早期大部分公司都會(huì)采用第一種方式,而隨著 RabbitMQ 3.5.7(2015 年底發(fā)布)的延遲插件的發(fā)布,因?yàn)槠涫褂酶?jiǎn)單、更方便,所以它現(xiàn)在才是大家普通會(huì)采用的,實(shí)現(xiàn)延遲隊(duì)列的方式。

(1)實(shí)現(xiàn)原理分析

使用延遲插件的實(shí)現(xiàn)原理是通過(guò)創(chuàng)建一個(gè)延遲交換機(jī)(Delay Exchange),延遲消息首先會(huì)把消息投遞到延遲交換機(jī),并不是直接將消息投遞業(yè)務(wù)隊(duì)列(所以不會(huì)立即執(zhí)行),由延遲交換機(jī)控制消息在延遲一段時(shí)間后,再將消息投遞到真正的隊(duì)列中進(jìn)行消費(fèi),從而實(shí)現(xiàn)延遲隊(duì)列,它的實(shí)現(xiàn)流程如下圖所示:

其中 Mnesia 可以理解為基于文件存儲(chǔ)的數(shù)據(jù)庫(kù)。

(2)優(yōu)缺點(diǎn)分析

使用死信隊(duì)列實(shí)現(xiàn)延遲任務(wù)有個(gè)缺點(diǎn),它不能實(shí)現(xiàn)隨機(jī)延遲任務(wù),每個(gè)無(wú)消費(fèi)者的隊(duì)列上只能設(shè)置一個(gè) ttl(消息過(guò)期時(shí)間),所以只能實(shí)現(xiàn)固定過(guò)期時(shí)間的延遲任務(wù)。

使用延遲插件實(shí)現(xiàn)延遲任務(wù)有以下兩個(gè)缺點(diǎn):

  • 消息丟失問(wèn)題:消息在真的被投遞到目標(biāo)消息隊(duì)列之前,是存放在接收到了這個(gè)消息的服務(wù)端本地的 Mnesia 里面。也就是說(shuō),如果這個(gè)時(shí)候還沒(méi)有刷新磁盤(pán),那么消息就會(huì)丟失;如果這個(gè)節(jié)點(diǎn)不可用了,那么消息也同樣會(huì)丟失。
  • 高并發(fā)問(wèn)題:這種實(shí)現(xiàn)方式不支持高并發(fā)場(chǎng)景,因?yàn)樗挥幸粋€(gè)延遲交換機(jī),當(dāng)高并發(fā)或數(shù)據(jù)量比較大時(shí)執(zhí)行效率就會(huì)比較低。
責(zé)任編輯:姜華 來(lái)源: 磊哥和Java
相關(guān)推薦

2023-09-05 15:48:14

RabbitMQ延遲隊(duì)列

2024-04-19 00:47:07

RabbitMQ消息機(jī)制

2024-05-08 14:49:22

Redis延遲隊(duì)列業(yè)務(wù)

2023-10-10 13:39:53

Spring隊(duì)列優(yōu)化

2024-07-05 17:47:21

@Async項(xiàng)目啟動(dòng)類(lèi)

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-07-17 17:54:28

XXLJob分布式任務(wù)Java

2024-01-26 13:16:00

RabbitMQ延遲隊(duì)列docker

2024-04-28 08:52:33

RabbitMQ延遲隊(duì)列延遲插件

2024-06-24 00:09:00

零拷貝技術(shù)MMapsendFile

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-08-29 16:30:27

2024-08-12 17:36:54

2021-12-08 10:47:35

RabbitMQ 實(shí)現(xiàn)延遲

2017-04-12 10:02:21

Java阻塞隊(duì)列原理分析

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫(kù)連接

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-07-31 08:28:37

DMAIOMMap

2020-11-24 09:03:41

一致性MySQLMVCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)