【經典面試題】RabbitMQ如何防止重復消費?

RabbitMQ的消息消費是有確認機制的,正常情況下,消費者在消費消息成功后,會發送一個確認消息,消息隊列接收到之后,就會將該消息從消息隊列中刪除,下次也就不會再投遞了。

但是如果存在網絡延遲的問題,導致確認消息沒有發送到消息隊列,導致消息重投了,是有肯呢個,所以當我們使用MQ的時候,消費者端自己也需要做好冪等控制來防止消息被重復消費。

那么問題來了,什么是冪等性?如何解決接口冪等的問題呢?

解決接口冪等問題,只需要記住一句口令“一鎖、二判、三更新”,只要嚴格遵守這個過程,那么就可以解決并發問題。

一鎖:第一步,先加鎖。可以加分布式鎖、或者悲觀鎖都可以。但是一定要是一個互斥鎖!

二判:第二步,進行冪等性判斷。可以基于狀態機、流水表、唯一性索引等等進行重復操作的判斷。

三更新:第三步,進行數據的更新,將數據進行持久化。

// 一鎖:先加一個分布式鎖
@DistributeLock(scene = "ORDER", keyExpression = "#request.identifier", expire = 3000)
public OrderResponse apply(OrderRequest request) {OrderResponse response = new OrderResponse();// 二判:判斷請求是否執行成功過OrderDTO orderDTO = orderService.queryOrder(request.getProduct(), request.getIdentifier());if (orderDTO != null) {response.setSuccess(true);response.setResponseCode("DUPLICATED");return response;}// 三更新:執行更新的業務邏輯return orderService.order(request);
}

三步需要嚴格控制順序,確保加鎖成功后進行數據查詢和判斷,冪等性判斷通過后再更新,更新結束后釋放鎖。

以上操作需要有一個前提,那就是第一步加鎖和第二步判斷的時候,需要有一個依據,這個就是冪等號了,通常需要和上游約定一個唯一 ID 作為冪等號。然后通過對冪等號加鎖,再通過對冪等號進行冪等判斷即可。

一鎖這個過程,建議使用 Redis 實現分布式鎖,因為他是非阻塞的高效率的互斥鎖。非常適合在冪等控制場景中。

二判這個過程,如果有操作流水,建議基于操作流水做冪等,并將冪等號作為唯一性約束,確保唯一性。如果沒有流水,那么基于狀態機也是可以的。

但是不管怎么樣,數據庫的唯一性約束都要加好,這是系統的最后一道防線了。萬一前面的鎖失效了,這里也能控制得住不會產生臟數據。

最后也就是說,我們在發送消息是需要生成一個唯一的標識并且把它放到消息體中,根據這個標識就可以判斷兩次消息是不是同一條。這樣我們在消費者端,接收到消息以后,只需要解析出消息體重的這個唯一標識,就可以通過“一鎖、二判、三更新”的方式來判斷是否消費成功過了。

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

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

相關文章

教程:在 Kubernetes 集群上部署 WordPress 網站

WordPress 是專為每個人設計的開源軟件,強調創建網站、博客或應用程序的可訪問性、性能、安全性和易用性。WordPress 是一個基于 PHP 的內容管理系統(CMS),使用 MySQL 作為數據存儲,目前很多網站、電商獨立站、個人博客…

AI新紀元-GPT-5

GPT-5:引領AI新紀元 隨著OpenAI首席技術官米拉穆拉蒂的確認,GPT-5的發布正在逐漸接近我們。從GPT-4到GPT-5的躍遷,不僅標志著技術層面的巨大進步,更是AI智能水平的一次質的飛躍。穆拉蒂將這一進步比喻為從高中生到博士生的成長&am…

深入比較:Symfony與Laravel框架的異同

引言 在現代Web開發領域,PHP框架扮演著至關重要的角色。Symfony和Laravel是兩個非常流行的PHP框架,它們各自有著獨特的設計理念、功能特性和社區支持。本文將深入探討這兩個框架的不同之處,包括設計理念、架構、性能、學習曲線、社區支持等方…

推薦系統三十六式學習筆記:原理篇.模型融合14|一網打盡協同過濾、矩陣分解和線性模型

目錄 從特征組合說起FM模型1.原理2.模型訓練3.預測階段4.一網打盡其他模型5.FFM 總結 在上一篇文章中,我們講到了使用邏輯回歸和梯度提升決策樹組合的模型融合辦法,用于CTR預估,給這個組合起了個名字,叫“輯度組合”。這對組合中&…

Yokogawa AQ6370E 10與AQ6370E 20 光譜儀的區別?

Yokogawa AQ6370E 20相比AQ6370E 10在波長準確度上有哪些改進? AQ6370E 20在波長準確度上相對于AQ6370E 10有明顯的提升,這對于需要高精度波長測量的應用來說是非常有益的。 波長精度提升:AQ6370E 20的波長精度相比AQ6370E 10有所提升&#…

SQL面試題練習 —— 查詢每個用戶的第一條和最后一條記錄

目錄 1 題目2 建表語句3 題解 題目來源:小紅書。 1 題目 現有一張訂單表 t_order 有訂單ID、用戶ID、商品ID、購買商品數量、購買時間,請查詢出每個用戶的第一條記錄和最后一條記錄。樣例數據如下: ---------------------------------------…

個人支付系統實現

基礎首頁: 訂單: 智能售卡系統 基于webmanworkerman開發 禁用函數檢查 使用這個腳本檢查是否有禁用函數。命令行運行curl -Ss https://www.workerman.net/check | php 如果有提示Function 函數名 may be disabled. Please check disable_functions in …

外星生命在地球的潛在存在:科學、哲學與社會的交織

外星生命在地球的潛在存在:科學、哲學與社會的交織 摘要:近年來,關于外星生命是否存在的討論日益激烈。有研究表明,外星人可能已經在地球漫步,這一觀點引發了廣泛的科學、哲學和社會學思考。本文將從科學角度探討外星…

線程池FutureTask淺談

一,概述 FuturnTask實現了Future與Runnable接口,筆者知道,ThreadPoolExecutor#submit可以傳入Callable接口而非Runnable,區別點在于Callable可以返回值,而整個FuturnTask可以理解為Callable設計,用來優雅地異步獲取執行結果,無需手動Condition去實現。 圍繞此,需知道…

鴻蒙開發系統基礎能力:【@ohos.wallpaper (壁紙)】

壁紙 說明: 本模塊首批接口從API version 7開始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。 導入模塊 import wallpaper from ohos.wallpaper;WallpaperType 定義壁紙類型。 系統能力: 以下各項對應的系統能力均為SystemCapability…

python接口自動化的腳本

使用Requests庫進行GET請求 Requests是Python中最常用的HTTP庫,用于發送HTTP請求。下面是一個簡單的GET請求示例,用于從API獲取數據。 import requests url = "https://api.example.com/data" response = requests.get(url) if response.status_code == 200:prin…

【項目實訓】falsk后端連接數據庫以及與前端vue進行通信

falsk連接數據庫 我們整個項目采用vueflaskmysql的框架,之前已經搭建好了mysql數據庫,現在要做的是使用flask連接到數據庫并測試 安裝flask 首先安裝flask pip install flask 進行數據庫連接 數據庫連接需要使用到pymysql庫以及flask庫 連接數據庫…

通過注釋語句,簡化實體類的定義(省略get/set/toString的方法)

引用Java的lombok庫,減少模板代碼,如getters、setters、構造函數、toString、equals和hashCode方法等 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructorData&#xf…

使用【docker】簡單部署打包構建好的鏡像并運行python項目

使用【docker】簡單部署運行python項目 方案一:使用打包好的鏡像直接運行 一.項目配置 項目壓縮包:project.tar.gz 項目目錄存放在服務器路徑:/var/opt/app (1)解壓項目文件到該目錄下:/var/opt/app 命令&#xff1…

Linux-引導過程與服務控制

目錄 一、Linux操作系統引導過程 1、引導過程總覽 2、引導過程詳解 2.1、開機自檢(BIOS) 2.2、 MBR引導 2.3、GRUB菜單 2.4、加載內核(kernel) 2.5、init進程初始化 3、系統初始化進程 3.1、Systemd單元類型 3.2、運行級別所對應的 Systemd 目…

SherlockChain:基于高級AI實現的智能合約安全分析框架

關于SherlockChain SherlockChain是一款功能強大的智能合約安全分析框架,該工具整合了Slither工具(一款針對智能合約的安全工具)的功能,并引入了高級人工智能模型,旨在輔助廣大研究人員針對Solidity、Vyper和Plutus智…

前端 Array.sort() 源碼學習

源碼地址 V8源碼Array 710行開始為sort()相關 Array.sort()方法是那種排序呢&#xff1f; 去看源碼主要是源于這個問題 // In-place QuickSort algorithm. // For short (length < 22) arrays, insertion sort is used for efficiency.源碼中的第一句話就回答了我的問題…

Potato(土豆)一款輕量級的開源文本標注工具(二)

示例項目&#xff08;模版&#xff09; Potato 旨在提高數據標注的可復制性&#xff0c;并降低研究人員設置新標注任務的成本。因此&#xff0c;Potato 提供了一系列預定義的示例項目&#xff0c;并歡迎公眾向項目中心貢獻。如果您使用 Potato 進行了自己的標注工作&#xff0…

海思平臺使用ITTP_Stream調試sensor

目錄 相關資料1.ISP相關資料2.MIPI RX相關資料3.sensor資料4.MIPI標準 準備工作1.準備sensor驅動2.準備sample vio3.準備上位機和下位機程序 運行1.只運行HiPQTool1.1.板端運行1.2.PC端運行HiPQTool 2.使用ITTP_Stream2.1.板端運行2.2.打開上位機軟件 相關資料 1.ISP相關資料 …

uniapp開發手機APP、H5網頁、微信小程序、長列表插件

ml-list 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id18928 ml-list介紹 1、ml-list 列表組件&#xff0c;包含基本列表樣式、可擴展插槽機制、長列表性能優化、多端兼容。 2、ml-list 低代碼列表&#xff0c;幫助使用者快速構建列表&#xff0c;簡單配置&…