AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

數十萬定時任務,如何高效觸發定時和超時

來源: 責編: 時間:2023-11-07 09:14:10 264觀看
導讀項目產品中,大家都會有"定時任務"和"定時超時"的需求,初始階段,我們基本都是用少數的一些timer,即使是任務量越來越大的時候,我們就難免維護著大量的timer,或者進行了大量低效的掃描。定時任務使用場景:當訂單一直處于未支付

項目產品中,大家都會有"定時任務"和"定時超時"的需求,初始階段,我們基本都是用少數的一些timer,即使是任務量越來越大的時候,我們就難免維護著大量的timer,或者進行了大量低效的掃描。PRj28資訊網——每日最新資訊28at.com

PRj28資訊網——每日最新資訊28at.com

定時任務使用場景:當訂單一直處于未支付狀態時,如何及時的關閉訂單(已經使用)PRj28資訊網——每日最新資訊28at.com

如何定期檢查處于退款狀態的訂單是否已經退款成功(后期重構使用)PRj28資訊網——每日最新資訊28at.com

PRj28資訊網——每日最新資訊28at.com

設計方案:PRj28資訊網——每日最新資訊28at.com

  • 整個Redis當做消息池,以KV形式存儲消息
  • 使用ZSET做優先隊列,按照Score維持優先級
  • 使用LIST結構,以先進先出的方式消費
  • ZSET和LIST存儲消息地址(對應消息池的每個KEY)
  • 使用定時器維護路由
  • 根據TTL規則實現消息延遲

PRj28資訊網——每日最新資訊28at.com

咱們公司現階段就是使用的這套方法:PRj28資訊網——每日最新資訊28at.com

1.新增一個job,會job_pool中插入一條數據,記錄了業務方消費方。也會在bucket插入一條記錄,記錄執行的時間戳PRj28資訊網——每日最新資訊28at.com

2.搬運線程會去bucket中查找哪些執行時間戳的RunTimeMillis比現在的時間小,將這些記錄全部刪除;同時會解析出每個任務的Topic是什么,然后將這些任務PUSH到TOPIC對應的列表queue中PRj28資訊網——每日最新資訊28at.com

3每個topic的list都會有一個監聽線程去批量獲取list中的待消費數據,獲取到的數據全部扔給這個topic的消費線程池PRj28資訊網——每日最新資訊28at.com

4.消費線程池執行會去job_pool查找數據結構,返回給回調結構,執行回調方法。PRj28資訊網——每日最新資訊28at.com

PRj28資訊網——每日最新資訊28at.com

圖片圖片PRj28資訊網——每日最新資訊28at.com

待優化的內容:PRj28資訊網——每日最新資訊28at.com

  1. 目前只有一個Queue隊列存放消息,當需要消費的消息大量堆積后,會影響消息通知的時效。改進的辦法是,開啟多個Queue,進行消息路由,再開啟多個消費線程進行消費,提供吞吐量
  2. 消息沒有進行持久化,存在風險,后續會將消息持久化到MongoDB中

一般來說還有什么其他方法實現這類需求呢?PRj28資訊網——每日最新資訊28at.com

“輪詢掃描法”PRj28資訊網——每日最新資訊28at.com

1.用一個Map<uid, last_packet_time>來記錄每一個uid最近一次請求時間last_packet_timePRj28資訊網——每日最新資訊28at.com

2.當某個用戶uid有請求包來到,實時更新這個MapPRj28資訊網——每日最新資訊28at.com

3.啟動一個timer,當Map中不為空時,輪詢掃描這個Map,看每個uid的last_packet_time是否超過30s,如果超過則進行超時處理PRj28資訊網——每日最新資訊28at.com

PRj28資訊網——每日最新資訊28at.com

“多timer觸發法”PRj28資訊網——每日最新資訊28at.com

1.用一個Map<uid, last_packet_time>來記錄每一個uid最近一次請求時間last_packet_timePRj28資訊網——每日最新資訊28at.com

2.當某個用戶uid有請求包來到,實時更新這個Map,并同時對這個uid請求包啟動一個timer,30s之后觸發PRj28資訊網——每日最新資訊28at.com

3.每個uid請求包對應的timer觸發后,看Map中,查看這個uid的last_packet_time是否超過30s,如果超過則進行超時處理PRj28資訊網——每日最新資訊28at.com

方案一:只啟動一個timer,但需要輪詢,效率較低PRj28資訊網——每日最新資訊28at.com

方案二:不需要輪詢,但每個請求包要啟動一個timer,比較耗資源PRj28資訊網——每日最新資訊28at.com

PRj28資訊網——每日最新資訊28at.com

ZSet(有序集合)數據結構來實現PRj28資訊網——每日最新資訊28at.com

  1. 創建ZSet:首先,你需要創建一個ZSet數據結構,其中每個訂單將作為一個成員,其分數將表示訂單的創建時間戳。你可以使用Redis等支持ZSet的數據庫來實現。
  2. 添加訂單:每當用戶創建新訂單時,將訂單添加到ZSet中,其中成員是訂單ID,分數是訂單的創建時間戳。
  3. 定時檢查訂單:定期(例如,每分鐘)執行一個程序或定時任務來檢查ZSet中的訂單。你可以使用程序來查詢ZSet,找到創建時間超過一定時間閾值的訂單,表示它們長時間未支付。
  4. 取消訂單:對于那些長時間未支付的訂單,可以將其從ZSet中刪除,并執行取消訂單的操作(例如,將訂單狀態設置為"已取消")。

PRj28資訊網——每日最新資訊28at.com

import redis.clients.jedis.Jedis;import redis.clients.jedis.Tuple;import java.util.Set;public class OrderCancellationSystem {    public static void main(String[] args) {        Jedis jedis = new Jedis("localhost"); // 連接到本地Redis服務器        // 模擬添加訂單        addOrder(jedis, "Order1");        addOrder(jedis, "Order2");        // 定時任務,每分鐘檢查訂單并自動取消        while (true) {            cancelLongUnpaidOrders(jedis);            try {                Thread.sleep(60000); // 等待一分鐘再次檢查            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    public static void addOrder(Jedis jedis, String orderId) {        long currentTime = System.currentTimeMillis();        jedis.zadd("orders", currentTime, orderId);    }    public static void cancelOrder(String orderId) {        // 執行取消訂單操作,例如更新訂單狀態        System.out.println("Cancelling order: " + orderId);    }    public static void cancelLongUnpaidOrders(Jedis jedis) {        long expirationTime = System.currentTimeMillis() - 3600 * 1000; // 60分鐘前的時間戳        Set<Tuple> longUnpaidOrders = jedis.zrangeByScoreWithScores("orders", "-inf", String.valueOf(expirationTime));        for (Tuple order : longUnpaidOrders) {            String orderId = order.getElement();            cancelOrder(orderId);            jedis.zrem("orders", orderId); // 從ZSet中刪除已取消的訂單        }    }}

PRj28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-17398-0.html數十萬定時任務,如何高效觸發定時和超時

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 了解 Go 中原子操作的重要性與使用方法

下一篇: Istio Envoy 配置解讀,看這篇就夠了

標簽:
  • 熱門焦點
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯網品牌官01 擦邊少女空降熱搜,幕后推手曝光被網友譽為&ldquo;純欲天花板&rdquo;的女網紅井川里予,近期因為一組哥特風照片登上熱搜,引發了一場互聯網世界關于
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
  • AI藝術欣賞體驗會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術欣賞體驗會”在上海
Top