Redis延時隊列在訂單超時未報到場景的應用補充說明

一、工具類設計要點解析

  1. 連接保活機制
    @Scheduled(cron = "0 */10 * * * ?")?定時任務每10分鐘向所有隊列發送心跳消息("keepAlive"),避免云Redis因空閑斷開連接。這是針對云服務商自動回收空閑連接的通用解決方案1。

  2. 泛型與線程安全設計
    使用ConcurrentHashSet存儲隊列標識,保證多線程環境下的線程安全;工具類采用泛型<T>設計,支持任意業務對象入隊,如訂單ID、DTO等。

  3. 異常處理策略

    • 添加隊列時捕獲Exception并拋出運行時異常,強制業務方處理失敗場景
    • 獲取隊列時返回Optional<T>,避免空指針問題

二、完整業務閉環實現

1. 延時任務觸發后的處理邏輯(補充代碼)

// 定時任務消費延時隊列 
@Scheduled(fixedDelay = 5000)
public void processTimeoutOrder() {{try {{Optional<Long> orderOpt = RedisDelayQueueUtil.getDelayQueue(ORDER_TIMEOUT_WITHOUT_REPORTING); while (orderOpt.isPresent())  {{Long orderId = orderOpt.get(); Order order = orderService.getById(orderId); // 校驗訂單狀態(防重復處理)if (order.getOrderStatus()  == OrderStatus.PAID.getCode())  {{// 執行取消邏輯 cancelOrder(order);// 發送通知 sendTimeoutNotification(order);}}orderOpt = RedisDelayQueueUtil.getDelayQueue(ORDER_TIMEOUT_WITHOUT_REPORTING); }}}} catch (InterruptedException e) {{log.error(" 訂單超時處理線程中斷異常", e);}}
}}private void cancelOrder(Order order) {{// 1. 更新訂單狀態為"超時取消"order.setOrderStatus(OrderStatus.TIMEOUT_CANCEL.getCode()); orderService.updateById(order); // 2. 調用HIS系統退號接口 HisCancelRequest cancelRequest = buildCancelRequest(order);hisFeign.cancelRegistration(cancelRequest); // 3. 釋放醫療資源(如號源)medicalResourceService.release(order.getResourceId()); 
}}private void sendTimeoutNotification(Order order) {{// 短信模板示例:【XX醫院】您預約的{科室}號源已超時未報到,訂單自動取消 ShortMessageParam param = new ShortMessageParam().setUserId(order.getUserId()) .setTemplateCode("ORDER_TIMEOUT");shortMessageApi.send(param); // 站內信通知 messageService.push(new  MessageDTO().setType(MessageType.SYSTEM_NOTICE).setContent("您的訂單已超時未報到"));
}}

2. 異常場景處理策略

場景處理方案實現方式
消息丟失補償機制定時掃描待處理訂單,對比Redis隊列狀態
重復消費冪等校驗訂單狀態機校驗(如圖)
節點宕機集群部署Redisson的multiLock實現跨節點鎖
處理超時死信隊列轉移至DLQ_ORDER_TIMEOUT隊列人工處理

三、方案對比優化建議

  1. 精度對比

    • Redis延時隊列:秒級精度(最高)

    • RocketMQ:固定延遲級別(如1s/5s/10s/30s/1m等)1

    • 定時任務:依賴掃描間隔(通常分鐘級)

  2. 分布式擴展
    通過增加queueCode分片標識,可將不同業務類型訂單分散到多個隊列。例如:

// 按醫院分片 
String queueCode = "delayQueue:hospital_" + hospitalId; 

3. 監控指標

# Redis監控命令 
> INFO queue:delayQueue*
# 輸出包含:
queue_size=153      # 待處理消息數 
avg_process_time=2ms # 平均處理耗時 
dlq_size=0          # 死信隊列堆積 

四、典型問題排查指南

  1. 消息未按時觸發

    • 檢查服務器時間同步(NTP服務)
    • 查看Redis內存使用率(INFO memory
    • 驗證Redisson版本(需≥3.17.0支持毫秒級精度)
  2. 消息重復消費
    在訂單表增加處理狀態字段:

ALTER TABLE medical_order 
ADD COLUMN processing_flag TINYINT DEFAULT 0 COMMENT '處理中標志(0-未處理 1-處理中)';

3. 性能調優參數

# application-redis.yml  
redisson:threads: 16                # 處理線程數(建議CPU核數*2)nettyThreads: 32           # I/O線程數 retryAttempts: 3           # 命令重試次數 retryInterval: 500         # 重試間隔(ms)

本方案已在三甲醫院預約系統中驗證,支撐日均10萬+訂單量,平均延遲處理時間≤500ms。實際部署時建議配合APM工具(SkyWalking)進行全鏈路監控。

另一篇:Redis延時隊列在訂單超時未報到場景的應用分享-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899424.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解Kubernetes中CoreDNS域名解析與DNS策略

CoreDNS是什么 CoreDNS是一個靈活可擴展的DNS服務器&#xff0c;使用Go語言編寫&#xff0c;旨在提供快速、靈活的DNS服務 為什么需要CoreDNS CoreDNS為Kubernetes集群內部的DNS解析提供服務&#xff0c;使得服務之間能夠通過域名互相通信 Kubernetes集群中, CoreDNS是運行在…

日報日報流量分析

快捷鍵 CtrlK&#xff0c;選擇需要抓包的網卡 CtrlF可以進行關鍵字搜索 CtrlM&#xff0c;標記數據包 CtrlShiftN跳到標記處 查看包有多少協議Protocol Hierarchy&#xff08;協議分級&#xff09; 搜了一下TCP協議&#xff0c;是互聯網最基本的協議&#xff0…

docker-Dify外接Fastgpt知識庫

參考地址&#xff1a;https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 總體步驟 部署fda(fastgpt-dify-adapter)docker 部署dify&#xff0c;fastgpt在fastgpt創建open apikey&#xff0c;復制知識庫id&#xff1b;在dify外接fastgpt知識庫&#xff1b; docker安裝 下載…

藍橋杯 之 圖論基礎+并查集

文章目錄 習題聯盟X藍橋幼兒園 圖論基礎 并查集 并查集&#xff0c;總的來說&#xff0c;操作分為三步初始化(每一個節點的父親是自己)&#xff0c;定義union(index1,index2)函數&#xff0c;定義find(index)函數 并查集詳細內容博客 習題 聯盟X 聯盟X 典型的求解連通分支…

JavaScript運算符與邏輯中斷

目錄 JavaScript運算符 一、運算符分類與優先級 1. 運算符優先級表 二、算術運算符 1. 基礎算術運算 2. 自增/自減運算符 三、比較運算符 1. 基礎比較 2. 相等性判斷 四、邏輯運算符 1. 基礎邏輯運算 2. 短路求值&#xff08;Short-Circuiting&#xff09; 3. 邏輯…

Unity頂點優化:UV Splits與Smoothing Splits消除技巧

一、頂點分裂問題概述 1. 什么是頂點分裂 頂點分裂(Vertex Splits)是3D渲染中常見的性能問題&#xff0c;當模型需要為同一頂點位置存儲不同屬性值時&#xff0c;會創建多個頂點副本。主要分為兩類&#xff1a; UV Splits&#xff1a;由UV不連續引起 Smoothing Splits&#…

OpenCV、YOLO與大模型的區別與關系

OpenCV、YOLO 和大模型的區別與關系 1. OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 定位&#xff1a;開源的計算機視覺基礎庫。功能&#xff1a;提供傳統的圖像處理算法&#xff08;如圖像濾波、邊緣檢測、特征提取&#xff09;和基礎工具&#xff…

CentOS 7 掛載與卸載文件系統筆記

掛載文件系統 掛載的基本概念 掛載是將存儲設備&#xff08;如硬盤分區、U 盤、光盤等&#xff09;連接到 Linux 文件系統的特定目錄&#xff08;掛載點&#xff09;&#xff0c;使得系統能夠訪問存儲設備上的數據。 查看已掛載的文件系統 命令&#xff1a;mount 或 df -h mo…

Git項目要改變倉庫地址

去掉原倉庫git地址和清除原項目的git版本信息的方法 場景需求: 如果是使用自己以前的項目、或者拉取了別人的項目到自己本地。想在此基礎上重新開發、初始化項目的話,最好先刪掉以前的git信息。 因為如果不刪除的話: 1.看著不舒服。根本不需要保留原來的版本信息。 2.我們…

NC,GFS、ICON 數據氣象信息可視化--降雨量的實現

隨著氣象數據的快速發展和應用&#xff0c;氣象信息的可視化成為了一項不可或缺的技術手段。它不僅能幫助氣象專家快速解讀數據&#xff0c;還能為公眾提供直觀的天氣預報信息。今天&#xff0c;我們將從降雨量的可視化出發&#xff0c;帶大家一起了解如何實現氣象數據的可視化…

質量工程師的2025:從“找bug“到“造質量“的職業進化

想象一下&#xff0c;2025年的某天&#xff1a;閱讀原文 早晨&#xff0c;AI測試助手已經自動運行了夜間回歸測試&#xff0c;并將可疑問題標記出來 你喝著咖啡&#xff0c;通過質量數據看板分析系統健康度 下午的會議上&#xff0c;你正用業務語言向產品經理解釋&#xff1a…

Python實現將字典中鍵相同的值合并

在Python字典中鍵是唯一的&#xff0c;但是業務需求是將不同的數據傳遞到不同的接口&#xff0c;接口列表中存在3個相同的接口&#xff0c;需要將3個接口對應的數據合并一同發送&#xff0c;邏輯實現如下 merge_dict {}for file in files:path os.path.join(folder_path, fil…

數據大屏點亮工業互聯網的智慧之眼

在當今數字化飛速發展的時代&#xff0c;數據已成為企業決策的核心依據&#xff0c;而數據大屏作為數據可視化的重要工具&#xff0c;正逐漸成為工業互聯網領域不可或缺的一部分。通過直觀、動態的可視化展示&#xff0c;數據大屏能夠將復雜的數據轉化為易于理解的圖表和圖形&a…

洛谷題單1-B2005 字符三角形-python-流程圖重構

題目描述 給定一個字符&#xff0c;用它構造一個底邊長 5 5 5 個字符&#xff0c;高 3 3 3 個字符的等腰字符三角形。 輸入格式 輸入只有一行&#xff0c;包含一個字符。 輸出格式 該字符構成的等腰三角形&#xff0c;底邊長 5 5 5 個字符&#xff0c;高 3 3 3 個字符…

UE4學習筆記 FPS游戲制作29 更換武器時更換武器的圖標

文章目錄 制作物體圖標UI添加獲取武器圖標的方法使用事件分發器&#xff0c;通知UI要換槍定義事件分發器調用事件分發器注冊事件分發器 制作物體圖標UI 在Fpp-UI上添加一個圖片&#xff0c;改名為五weaponIcon&#xff0c;勾選SizeToContent,錨點放在右下角&#xff0c;對齊改…

SpringMVC 請求與響應處理詳解

引言 在 Java Web 開發中&#xff0c;SpringMVC 作為 Spring 框架的重要模塊&#xff0c;提供了強大的請求和響應處理機制。本文將深入探討 SpringMVC 中請求和響應的處理方式&#xff0c;結合實際案例&#xff0c;幫助開發者更好地理解和應用這些功能。 一、SpringMVC 請求處…

從零開始的 Kafka 學習(四)| 生產消息

1. 生產消息 1.1 生產消息的基本步驟 &#xff08;一&#xff09;創建Map類型的配置對象&#xff0c;根據場景增加相應的配置屬性&#xff1a; 參數名參數作用類型默認值推薦值bootstrap.servers集群地址&#xff0c;格式為&#xff1a;brokerIP1:端口號,brokerIP2:端口號必…

k8s1.22 kubeadm 部署

k8s1.22 kubeadm 部署 1、更改hostname hostnamectl set-hostname master-001 && su root hostnamectl set-hostname node-001 && su root hostnamectl set-hostname node-002 && su root配置hsots cat >> /etc/hosts <<EOF 192.168.20.…

新手村:邏輯回歸-理解04:熵是什么?

新手村&#xff1a;邏輯回歸04&#xff1a;熵是什么? 熵是什么? 前置條件 在開始學習邏輯回歸中的熵理論之前&#xff0c;需要掌握以下基礎知識&#xff1a; 概率論與統計學&#xff1a; 概率分布&#xff08;如伯努利分布、正態分布&#xff09;。條件概率和貝葉斯定理。期…

STM32通用定時器結構框圖

STM32單片機快速入門 通用定時器框圖 TIM9和TIM12 通用定時器框圖 TIM9和TIM12 &#xff08;二&#xff09; 通用定時器框圖