色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一種異步延遲隊列的實現方式調研

OSC開源社區 ? 來源:京東云開發者 ? 2023-03-31 10:10 ? 次閱讀

一、應用場景

目前系統中有很多需要用到延時處理的功能:支付超時取消、排隊超時、短信、微信等提醒延遲發送、token刷新、會員卡過期等等。通過延時處理,極大地節省系統的資源,不必輪詢數據庫處理任務。

目前大部分功能通過定時任務完成,定時任務還分使用quartz及xxljob兩種類型輪詢時間短,每秒執行一次,對數據庫造成一定的壓力,并且會有1秒的誤差。輪詢時間久,如30分鐘一次,03:01插入一條數據,正常3:31執行過期,但是3:30執行輪詢時,掃描330的數據,是掃描不到3:31的數據的,需要4:00的時候才能掃描到,相當于多延遲了29分鐘!

二、演示處理方式調研

1.DelayQueue

實現方式:

jvm提供的延遲阻塞隊列,通過優先級隊列對不同延遲時間任務進行排序,通過condition進行阻塞、睡眠dealy時間 獲取延遲任務。

當有新任務加入時,會判斷新任務是否是第一個待執行的任務,若是,會解除隊列睡眠,防止新加入的元素時需要執行的元素而不能正常被執行線程獲取到。

存在的問題:

單機運行,系統宕機后,無法進行有效的重試

沒有執行記錄和備份

沒有重試機制

系統重啟時,會將任務清空!

不能分片消費

優勢: 實現簡單,無任務時阻塞,節省資源,執行時間準確

2.延遲隊列mq

實現方式:依賴mq,通過設置延遲消費時間,達到延遲消費功能。像rabbitMq、jmq都可以設置延遲消費時間。RabbitMq通過將消息設置過期時間,放入私信隊列進行消費實現。

存在的問題:時間設置不靈活,每個queue是固定的到期時間,每次新創建延時隊列,需要創建新的消息隊列

優點:依靠jmq,可以有效的監控、消費記錄、重試,具備多機同時消費能力,不懼怕宕機

3.定時任務

通過定時任務輪詢符合條件的數據

缺點:

必須要讀業務數據庫,對數據庫造成一定的壓力,

存在延時

一次掃描數據量過大時,占用過多的系統資源。

無法分片消費

優點:

消費失敗后,下次還能繼續消費,具備重試能力,

消費能力穩定

4.redis

任務存儲在redis中,使用redis的 zset隊列根據score進行排序,程序通過線程不斷獲取隊列數據消費,實現延時隊列

優點:

查詢redis相比較數據庫快,set隊列長度過大,會根據跳表結構進行查詢,效率高

redis可根據時間戳進行排序,只需要查詢當前時間戳內的分數的任務即可

無懼機器重啟

分布式消費

缺點:

受限于redis性能,并發10W

多個命令無法保證原子性,使用lua腳本會要求所有數據都在一個redis分片上。

5. 時間輪

通過時間輪實現的延遲任務執行,也是基于jvm單機運行,如kafka、netty都有實現時間輪,redisson的看門狗也是通過netty的時間輪實現的。

缺點:不適合分布式服務的使用,宕機后,會丟失任務。

d0c5de70-cf06-11ed-bfe3-dac502259ad0.jpg

三、實現目標

兼容目前在使用的異步事件組件,并提供更可靠,可重試、有記錄、可監控報警、高性能的延遲組件。

消息傳輸可靠性:消息進入到延遲隊列后,保證至少被消費一次。

Client支持豐富:支持多重語言。

高可用性:支持多實例部署。掛掉一個實例后,還有后備實例繼續提供服務。

實時性:允許存在一定的時間誤差。

支持消息刪除:業務使用方,可以隨時刪除指定消息。

支持消費查詢

支持手動重試

對當前異步事件的執行增加監控

四、架構設計

d0db2f8c-cf06-11ed-bfe3-dac502259ad0.png

五、延遲組件實現方式

1.實現原理

目前選擇使用jimdb通過zset實現延時功能,將任務id和對應的執行時間作為score存在在zset隊列中,默認會按照score排序,每次取0-當前時間內的score的任務id,

發送延遲任務時,會根據時間戳+機器ip+queueName+sequence 生成唯一的id,構造消息體,加密后放入zset隊列中。

通過搬運線程,將達到執行時間的任務移動到發布隊列中,等待消費者獲取。

監控方通過集成ump

消費記錄通過redis備份+數據庫持久化完成。

通過緩存實現的方式,只是實現的一種,可以通過參數控制使用哪一種實現方式,并可通過spi自由擴展。

2.消息結構

每個Job必須包含以下幾個屬性:

Topic:Job類型,即QueueName

Id:Job的唯一標識。用來檢索和刪除指定的Job信息

Delay:Job需要延遲的時間。單位:秒。(服務端會將其轉換為絕對時間)

Body:Job的內容,供消費者做具體的業務處理,以json格式存儲。

traceId:發送線程的traceId,待后續pfinder支持設置traceId后,可與發送線程公用同一個traceiD,便于日志追蹤

具體結構如下圖表示:

d113aa24-cf06-11ed-bfe3-dac502259ad0.png

TTR的設計目的是為了保證消息傳輸的可靠性。

3.數據流轉及流程圖

d12e09be-cf06-11ed-bfe3-dac502259ad0.png

基于redis-disruptor方式進行發布、消費,可以作為消息來進行使用,消費者采用原有異步事件的disruptor無鎖隊列消費,不同應用、不同queue之間無鎖

1)支持應用只發布,不消費,達到消息隊列的功能。

2)支持分桶,針對大key問題,若事件多,可以設置延遲隊列和任務隊列桶的數量,減小因大key造成的redis阻塞問題。

3)通過ducc配置,進行性能的擴展,目前只支持開啟消費和關閉消費。

4)支持設置超時時間配置,防止消費線程執行過久

?瓶頸:消費速度慢,生產速度過快,會導致ringbuffer隊列占滿,當前應用既是生產者也是消費者時,生產者會休眠,性能取決于消費速度,可通過水平擴展機器,直接提升性能。監控redis隊列的長度,若不斷增長,可考慮增加消費者,直接提高性能。

可能出現的情況:因一個應用公用一個disruptor,擁有64個消費者線程,如果某一個事件消費過慢,導致64個線程都在消費這個事件,會導致其他事件無消費線程消費,生產者線程也被阻塞,導致所有事件的消費都被阻塞。

后期觀察是否有這個性能瓶頸,可給每一個queue一個消費者線程池。

六、demo示例

增加配置文件

判斷是否開啟jd.event.enable:true

 com.jd.car
 senna-event
 1.0-SNAPSHOT 
配置
jd:
senna:
event:
enable: true
queue:
retryEventQueue:
bucketNum: 1
handleBean: retryHandle
消費代碼:

package com.jd.car.senna.admin.event;


import com.jd.car.senna.event.EventHandler;
import com.jd.car.senna.event.annotation.SennaEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
* @author zhangluyao
* @description
* @create 2022-02-21-9:54 下午
*/
@Slf4j
@Component("retryHandle")
public class RetryQueueEvent extends EventHandler {


@Override
protected void onHandle(String key, String eventType) {
log.info("Handler開始消費:{}", key);
}


@Override
protected void onDelayHandle(String key, String eventType) {
log.info("delayHandler開始消費:{}", key);
}
}

注解形式:


package com.jd.car.senna.admin.event;


import com.jd.car.senna.event.EventHandler;
import com.jd.car.senna.event.annotation.SennaEvent;
import lombok.extern.slf4j.Slf4j;


/**
* @author zhangluyao
* @description
* @create 2022-02-21-9:54 下午
*/
@Slf4j
@SennaEvent(queueName = "testQueue", bucketNum = 5,delayBucketNum = 5,delayEnable = true)
public class TestQueueEvent extends EventHandler {


@Override
protected void onHandle(String key, String eventType) {
log.info("Handler開始消費:{}", key);
}


@Override
protected void onDelayHandle(String key, String eventType) {
log.info("delayHandler開始消費:{}", key);
}
}

發送代碼:


package com.jd.car.senna.admin.controller;


import com.jd.car.senna.event.queue.IEventQueue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


import javax.annotation.Resource;
import java.util.concurrent.CompletableFuture;




/**
* @author zly
*/
@RestController
@Slf4j
public class DemoController {


@Lazy
@Resource(name = "testQueue")
private IEventQueue eventQueue;


@ResponseBody
@GetMapping("/api/v1/demo")
public String demo() {
log.info("發送無延遲消息");
eventQueue.push("no delay 5000 millseconds message 3");
return "ok";
}


@ResponseBody
@GetMapping("/api/v1/demo1")
public String demo1() {
log.info("發送延遲5秒消息");
eventQueue.push(" delay 5000 millseconds message,name",1000*5L);
return "ok";
}


@ResponseBody
@GetMapping("/api/v1/demo2")
public String demo2() {
log.info("發送延遲到2022-04-02 00:00:00執行的消息");
eventQueue.push(" delay message,name to 2022-04-02 00:00:00", new Date(1648828800000));
return "ok";
} 


}





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 看門狗
    +關注

    關注

    10

    文章

    565

    瀏覽量

    70833
  • SPI接口
    +關注

    關注

    0

    文章

    258

    瀏覽量

    34392
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12236
  • Redis
    +關注

    關注

    0

    文章

    376

    瀏覽量

    10882

原文標題:一種異步延遲隊列的實現方式

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    用FPGA芯片實現高速異步FIFO的一種方法

    現代集成電路芯片中,隨著設計規模的不斷擴大。個系統中往往含有數個時鐘。多時鐘帶來的個問題就是,如何設計異步時鐘之間的接口電路。異步 FIFO(First In First Out)
    發表于 05-28 10:56 ?3848次閱讀

    延遲隊列實現方式

    由MQ中消費到完整的數據則直接處理,否則進入其他流程。 針對這種場景使用了延遲任務來實現,以此為契機對延遲任務相關的技術做了個簡單了解... 簡介 延遲任務是
    的頭像 發表于 09-30 11:17 ?819次閱讀

    Spring Boot如何實現異步任務

    Spring Boot 提供了多種方式實現異步任務,這里介紹三主要實現方式。 1、基于注解
    的頭像 發表于 09-30 10:32 ?1443次閱讀

    異步電路匹配延遲延遲線,如何設計能實現自適應連續地調整延遲長度

    異步電路匹配延遲延遲線如何設計能實現自適應連續地調整延遲長度。這是個新的想法,希望有大神能和
    發表于 03-19 17:19

    請問怎樣去設計一種異步FIFO?

    為什么要設計一種異步FIFO?異步FIFO的設計原理是什么?怎樣去設計一種異步FIFO?
    發表于 06-18 09:20

    怎樣去設計一種采用覆蓋機制的FIFO隊列模型呢

    FIFO隊列是什么?怎樣去設計一種采用覆蓋機制的FIFO隊列模型呢?
    發表于 12-08 06:07

    實現隊列環形緩沖的方法

    串口隊列環形緩沖區隊列串口環形緩沖的好處代碼實現隊列??要實現隊列環形緩沖,還需要
    發表于 02-21 07:11

    如何去實現一種隊列程序的設計呢

    隊列的原理是什么?隊列有何作用?如何去實現一種隊列程序的設計呢?
    發表于 02-25 07:50

    一種改進的主動隊列管理算法

    主動隊列管理是實現網絡擁塞控制的重要技術,但是多數主動隊列管理算法如隨機早期檢(RED)都存在對參數依賴性強的問題。針對RED算法中平均隊列長度不能完全反映網絡擁塞狀況的
    發表于 04-13 09:08 ?14次下載

    一種高效的磁盤隊列I/O機制

    分析了傳統磁盤隊列的存儲管理開銷和讀寫性能,針對磁盤隊列I/O已成為影響消息服務器性能的首要瓶頸,提出了一種高效磁盤隊列I/O機制—FlashQ。FlashQ采用物理上連續的磁盤塊
    發表于 05-14 19:51 ?32次下載

    異步傳輸方式的HDLC協議的實現

    研究實現一種 HDLC (High Level Data Link Contr01)協議的改進方法,該方法把HDLC協議傳統的同步傳榆方式改成了異步傳輸
    發表于 07-20 17:25 ?62次下載
    <b class='flag-5'>異步</b>傳輸<b class='flag-5'>方式</b>的HDLC協議的<b class='flag-5'>實現</b>

    一種基于信號延遲的光網絡攻擊方式

    針對光網絡攻擊易被發現的問題,提出一種基于信號延遲插入的光網絡攻擊方式。該方法在不改變鏈路光學性能的基礎上,利用信號延遲在系統中引起較高的串擾,極大的降低了系統的
    發表于 03-20 15:34 ?27次下載
    <b class='flag-5'>一種</b>基于信號<b class='flag-5'>延遲</b>的光網絡攻擊<b class='flag-5'>方式</b>

    TencentOS-tiny中環形隊列實現

    1. 什么是隊列隊列(queue)是一種只能在端插入元素、在另端刪除元素的數據結構,遵循「先入先出」(FIFO)的規則。 隊列中有兩個基
    的頭像 發表于 10-08 16:30 ?1390次閱讀

    如何用Redis實現延遲隊列呢?

    前段時間有個小項目需要使用延遲任務,談到延遲任務,我腦子第時間閃而過的就是使用消息隊列來做,比如RabbitMQ的死信
    的頭像 發表于 03-16 14:28 ?676次閱讀

    JavaWeb消息隊列使用指南

    在現代的JavaWeb應用中,消息隊列(Message Queue)是一種常見的技術,用于異步處理任務、解耦系統組件、提高系統性能和可靠性。 1. 消息隊列的基本概念 消息
    的頭像 發表于 11-25 09:27 ?152次閱讀
    主站蜘蛛池模板: 久久久无码精品亚洲A片软件| 欧美在线激情| 大陆极品少妇内射AAAAAA| 九九热视频这里只有精| 翁熄性放纵交换01| 艳鉧动漫1~6全集观看在线| 佐山爱痴汉theav| 久久久久久久久亚洲| 亚洲精品乱码电影在线观看 | avtt一区| 国产麻豆精品久久一二三| 久久久久国产精品美女毛片| 亚洲H成年动漫在线观看不卡| 2022精品福利在线小视频| 成人国产精品视频频| 欧美性猛交AAA片| yin乱教师系列合集| 日日日操操操| 2020最新国产自产精品| 麻豆影视在线直播观看免费| 正能量不良WWW免费窗口| 国产精品自在在线午夜精品| 偷尝禁果H1V1幸运的山熊| 国产精品久久久久久久久齐齐| 午夜伦理:伦理片| xxnx18日本| 久久伊人免费| 97免费视频在线观看| 黄色毛片a| 偷拍亚洲制服另类无码专区| 国产老肥熟xxxx| 亚洲欧美自拍明星换脸| 高清国产在线播放成人| 十八禁啪啦啪漫画| 国产成人高清精品免费5388密| 午夜福利理论片在线播放| 精品国产乱码久久久久久免费 | 芭乐视频网页版在线观看| 乌克兰成人性色生活片| 狠狠色色综合站| 新版孕妇bbwbbwbbw|