RabbitMQ消息中間件技術精講10 高級篇三 冪等性保障不重複消費

2020-12-16 凱哥Java

利用冪等性保障消息不被重複消費

本文主要內容:

一:冪等性概念

什麼是冪等性?

在網絡超時等問題除外下,要求一次或多次請求同一個資源,對資源本身產生的影響和第一次執行的影響相同。

關於冪等性更詳細的介紹,可以參見《拓展知識一:冪等性》這篇文章。

冪等性我們可以借鑑資料庫的樂觀鎖機制來理解:

比如,我們執行一條更新庫存的sql語句:

update table set count = count -1 where id = 1

流程說明:

在高並發的情況下,比如秒殺系統,現在商品就剩下一個了。如果我們執行:update table set count = count -1 where id = 1這個sql語句的時候,高並發情況會導致庫存成為負數,這種操作是有問題的。所以我們可以就是用樂觀鎖:

添加版本欄位,通過版本號欄位來處理。

在查詢的時候,假設查詢的版本號是1,在更新的時候拿著版本號作為更新條件即where version=1來更新。高並發時候,第一個執行完成後,version+1了。當第二條更新時候,發現已經不是1了就更新不了。關於mysql資料庫樂觀鎖和悲觀鎖的詳細介紹,可以參見《拓展知識二:mysql資料庫中樂觀鎖和悲觀鎖》

二:消費端如何保障冪等性消費

問題:

在海量訂單產生的業務高峰期,如何避免消息被重複的消費呢?

答案:在消費端實現冪等性即可。

消息端實現冪等性,就意味著,我們的消息永遠不會消費多次,即使我們發送多條一樣的消息

三:業界主流的冪等性操作

唯一ID+指紋碼機制

名稱解釋:

唯一ID:如資料庫的主鍵id

指紋碼:業務規則標識唯一的。如時間戳+銀行返回的唯一碼。需要注意的是,這個指紋碼不一定就是我們系統生產的,可能是我們自己業務規則或者是外部返回的一些規則經過拼接後的東西。其目的:就是為了保障此次操作達到絕對唯一的。

唯一ID+指紋碼機制,利用資料庫主鍵去重。如:

Select count(id) from table where id = 唯一ID+指紋碼

好處:實現簡單

壞處:高並發下有資料庫希爾的性能瓶頸

解決方案:對唯一ID進行分庫分表進行算法路由

利用redis原子特性實現

使用redis進行冪等需要考慮的問題

第一:我們是否需要進行數據入?如果需要入庫的話,關鍵解決的問題是資料庫和緩存如何做到原子性?

第二:如果步進行入庫?那麼都存儲在緩存中,如何設置定時同步的策略?

這兩個問題歡迎大家發表自己的見解。

在下節中,我們將學習Confirm消息確認機制。

相關焦點

  • RabbitMQ消息中間件技術精講11 高級篇四 confirm 確認消息
    RabbitMQ消息中間件技術精講11 高級篇四 confirm 確認消息理解Confirm消息確認機制:消息的確認,是指生產者投遞消息後,如果broker收到消息,則會給生產者一個應答;生產者經行接收應答,用來確定這條消息是否正常的發送到broker,這種方式也是消息的可靠性投遞的核心保障!
  • 保證MQ消費消息的冪等性,真可以用版本號的方式?
    你們都說可以用版本號來解決冪等性消費?什麼才是消息冪等性消費的根本性問題?隨著系統的複雜性不斷增加,多數系統都會引入MQ來進行解耦,其實從引入MQ的初衷來說,多數系統是為了解耦多個模塊帶來的複雜性,而有些「架構師」卻說的:為了解決性能問題。
  • 消息隊列:Rabbitmq如何保證不丟消息
    於是便整理了這篇文章來跟大家分享下,自己的理解,如有不準確的地方或者不同的意見,還請各位能夠給出反饋,我們可以討論,相互學習,相互成長。基礎知識:在開始探討這個問題之前,筆者還是覺得很有必要將rabbitmq的架構等基礎知識回顧下,如下所示:對於使用rabbitmq的服務來說,主要由三部分構成,它們分別是:生產者,rabbitmq,消費者。
  • 高並發分布式場景最全的MQ消息重發冪等性解決方案
    一、冪等性是什麼?在編程中,一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重複執行,並能獲得相同結果的函數。三、防重複消息冪等性解決方案1、生產者重複發消息MQ冪等性設計MQ在接收生產者傳來的消息時,MQ內部會生成一個全局唯一與業務無關的消息ID:inner-msg-id。
  • SpringBoot 接口冪等性的實現方案
    三、為什麼需要實現冪等性在接口調用時一般情況下都能正常返回信息不會重複提交,不過在遇見以下情況時可以就會出現問題,如:前端重複提交表單: 在填寫一些表格時候,用戶填寫完成提交,很多時候會因網絡波動沒有及時對用戶做出提交成功響應,致使用戶認為沒有成功提交,然後一直點提交按鈕,這時就會發生重複提交表單請求
  • 冪等性學習及接口的冪等性
    冪等性學習一:什麼是冪等性在這裡需要有以下幾個問題需要注意:1:冪等性的實質是一次或多次請求同一個資源,其結果是相同的。其關注的是對資源產生的影響(副作用)而不是結果,結果可以不同。重複提交操作帶來的嚴重後果在交易系統、支付系統中因重複提交而產生的問題尤其的明顯。如:我們發起支付的時候向支付寶支付請求,無論是交易系統自身bug還是交易系統與支付寶之間的網絡問題導致重複發送,支付寶應該並且必須只能扣用戶一次錢的。在這種需求下的系統在設計的時候,我們就需要將系統或者服務設計成冪等的。
  • 接口的冪等性,Restful接口的冪等性
    接口的冪等性,Restful接口的冪等性說到接口的冪等性,我們先看看什麼是冪等?什麼是冪等?為什麼需要冪等在計算機應用中,可能遇到網絡抖動,臨時故障,或者服務調用失敗,尤其是分布式系統中,接口調用失敗更為常見。為了保證服務的完整性,我們可能會發起接口的重試調用,如果接口不處理冪等,可能對系統造成很大的影響,因此接口的冪等設計尤其更為重要。
  • 實戰|SpringBoot+RabbitMQ,保證消息100%投遞成功並被消費
    , 等等這些都是圍繞上面那張整體流程圖展開的, 所以有必要先貼出來, 見圖知意二、實現思路簡略介紹163郵箱授權碼的獲取編寫發送郵件工具類編寫RabbitMQ配置文件生產者發起調用消費者發送郵件定時任務定時拉取投遞失敗的消息, 重新投遞各種異常情況的測試驗證拓展: 使用動態代理實現消費端冪等性驗證和消息確認(ack)三、項目介紹springboot
  • SpringBoot+RabbitMQ (保證消息100%投遞成功並被消費)
    三、項目介紹springboot版本2.1.5.RELEASE, 舊版本可能有些配置屬性不能使用, 需要以代碼形式進行配置RabbitConfig: rabbitmq相關配置TestServiceImpl: 生產者, 發送消息MailConsumer: 消費者, 消費消息, 發送郵件ResendMsg: 定時任務, 重新投遞發送失敗的消息說明
  • 詳解SpringCloud中RabbitMQ消息隊列原理及配置,一篇就夠!
    則消息會丟失。如果consumer先啟動,創建queue後,producer發送消息可以正常消費。那麼當所有的consumer宕機的時候,queue會auto-delete,消息仍舊會丟失。這種情況,消息不可靠。有丟失的可能。Rabbitmq的消息可靠性處理,分為兩部分。消息不丟失。
  • 第三屆信也科技技術沙龍:揭秘消息中間件的原理與實踐
    12月12日,由信也科技集團(NYSE:FINV)旗下布道師FTE(FINV technology evangelist)主辦的技術沙龍在上海舉行,此次沙龍是面向網際網路研發人員的技術沙龍活動,至今已成功舉辦三屆。
  • 消息架構的設計難題以及應對之道
    概述在微服務開發中我們經常會引入消息中間件實現業務解耦,執行異步操作, 現在讓我們來看看使用消息中間件的好處和弊端。首先需要肯定是使用消息組件有很多好處,其中最核心的三個是:解耦、異步、削峰。
  • 微服務冪等性
    1.3 重試機制降低微服務失敗率提高至四個或五個9提高微服務架構的容錯性提高微服務架構的高可靠性2 冪等分析2.1 冪等場景        可能會發生重複請求或消費的場景,在微服務架構中是隨處可見的。以下是筆者梳理的幾個常見場景:網絡波動:因網絡波動,可能會引起重複請求分布式消息消費:任務發布後,使用分布式消息服務來進行消費用戶重複操作:用戶在使用產品時,可能會無意的觸發多筆交易,甚至沒有響應而有意觸發多筆交易未關閉的重試機制
  • 在K8S上部署rabbitmq集群-有狀態服務
    按照傳統的方式,下單過程要等到調用完畢之後才能返回下單成功,如果網絡產生波動等原因使得商品服務扣庫存延遲或者失敗,會帶來較差的用戶體驗,如果在高並發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就需要消息隊列登場了。消息隊列提供一個異步通信機制,消息的發送者不必一直等待到消息被成功處理才返回,而是立即返回。
  • 提升RabbitMQ消費速度的一些實踐
    因此才有了Prefetch count,用於控制消息發送給消費者的速度;這個方案需要配合Ack使用,消費者回復消息Ack後,RabbitMQ才會繼續發送同等數量的消息到消費者。提高Prefetch count到一個合適的值可以提升消息的消費速度。這個值的設定可能還要實時參考上邊提到的三個時間,這有點類似TCP的流控措施。
  • 看完這篇,還怕面試官問消息中間件麼?
    說到消息中間件,工作中經常會用到MQ消息中間件,常見的消息中間件有Apache的ActiveMQ以及RabbitMQ。不管是ActiveMQ還是RabbitMQ都是基於JMS規範的消息中間件,它們都是消息服務的「提供者」。那麼什麼是 JMS?
  • 接口的冪等性的多重考慮,你會了嗎?
    當然,在接口設計中我們要考慮很多問題,安全性,格式,設計等等,今天我們先來聊聊,在高並發環境下,接口冪等性的解決方案有哪些。正文1 接口冪等性就是說在多次相同的操作下保證最終的結果是一致的。其實這個概念還是比較簡單的,很容易理解,那我們思考一個問題,如果不保證接口冪等性會有什麼問題?
  • 常見Rabbitmq面試題及答案總結
    1、 什麼是 rabbitmq釆用AMQP高級消息隊列協議的一種消息隊列技術撮大的特點就是消費並不需要 確保提供方存在,實現了服務之間的高度解耦2、 為什麼要使rabbitmq(1) 在分布式系統下具備異步,削峰,負載均衡等一系列高級功能
  • 除了HAProxy,RabbitMQ集群還可以這樣用
    在另一臺服務上,重複上面的安裝過程,配置用戶和管理界面步驟可以略過。複製前一臺伺服器上的cookie到新安裝的這臺伺服器,cookie所在目錄為:/var/lib/rabbitmq/.erlang.cookie。Tips:如果copy,需要注意.erlang.cookie文件的權限必須是400。