日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

41x28資訊網——每日最新資訊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中刪除已取消的訂單        }    }}

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

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

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

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

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

標簽:
  • 熱門焦點
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 三星電子Q2營收60萬億韓元 存儲業務營收同比仍下滑超過50%

    7月27日消息,據外媒報道,從三星電子所發布的財報來看,他們主要利潤來源的存儲芯片業務在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設備解決方案
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top 主站蜘蛛池模板: 鄢陵县| 策勒县| 巴林左旗| 临江市| 阿尔山市| 施秉县| 金秀| 红桥区| 南皮县| 永泰县| 曲麻莱县| 吉首市| 岫岩| 南乐县| 洛川县| 公主岭市| 布尔津县| 虹口区| 灵宝市| 山东省| 井冈山市| 如东县| 巴彦县| 台南市| 宜州市| 南漳县| 玉环县| 张家口市| 姚安县| 长沙市| 乾安县| 托里县| 夏邑县| 阳原县| 民乐县| 霍山县| 布拖县| 大名县| 梨树县| 隆安县| 张北县|