1. 程式人生 > >訊息重複的處理---冪等性淺談

訊息重複的處理---冪等性淺談

概述

冪等性原本是數學上的概念,即使公式:f(x)=f(f(x)) 能夠成立的數學性質。用在程式設計領域,則意為對同一個系統,使用同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的

冪等性是分散式系統設計中十分重要的概念,具有這一性質的介面在設計時總是秉持這樣的一種理念:呼叫介面發生異常並且重複嘗試時,總是會造成系統所無法承受的損失,所以必須阻止這種現象的發生

冪等有兩個維度:一是空間維度上的冪等,即冪等物件的範圍,是個人還是機構,是某一次交易還是某種型別的交易...二是時間維度上的冪等,即冪等的保證時間,是幾秒、幾分鐘還是永久性的...

不同的需求,會有不一樣的解決方案,難度和成本也不一樣。

冪等性適用領域

試想這樣的一種場景:在電商平臺上支付後,因為網路原因導致系統提示你支付失敗,於是你又重新付款了一次,等完成後檢查網銀髮現被系統扣了兩次款,這是一種什麼樣的體驗?

造成上述問題的原因可能有很多,比如第一次付款時實際支付成功,但是資訊返回時網路中斷導致系統誤判;又比如第一次付款的確失敗了,但第二次付款時發生意外,導致支付請求被重複傳送等等。在一次支付的過程中,每個環節都有可能會發生問題,我們要如何規避這類問題引發的分險?

冪等性是解決這類問題的方案之一,所以在電商,銀行,網際網路金融等對資料準確性要求很高的領域中,這一特性具有十分重要的地位。

冪等的常用思路

1. MVCC:####

多版本併發控制,樂觀鎖的一種實現,在資料更新時需要去比較持有資料的版本號,版本號不一致的操作無法成功。例如部落格點贊次數自動+1的介面:

public boolean addCount(Long id, Long version);
update blogTable set count= count+1,version=version+1 where id=321 and version=123 

每一個version只有一次執行成功的機會,一旦失敗必須重新獲取。

2. 去重表:####

利用資料庫表單的特性來實現冪等,常用的一個思路是在表上構建唯一性索引,保證某一類資料一旦執行完畢,後續同樣的請求再也無法成功寫入。

例子還是上述的部落格點贊問題,要想防止一個人重複點贊,可以設計一張表,將部落格id與使用者id繫結建立唯一索引,每當使用者點贊時就往表中寫入一條資料,這樣重複點讚的資料就無法寫入。

3. TOKEN機制:####

這種機制就比較重要了,適用範圍較廣,有多種不同的實現方式。其核心思想是為每一次操作生成一個唯一性的憑證,也就是token。一個token在操作的每一個階段只有一次執行權,一旦執行成功則儲存執行結果。對重複的請求,返回同一個結果。

以電商平臺為例子,電商平臺上的訂單id就是最適合的token。當用戶下單時,會經歷多個環節,比如生成訂單減庫存減優惠券等等。

每一個環節執行時都先檢測一下該訂單id是否已經執行過這一步驟,對未執行的請求,執行操作並快取結果,而對已經執行過的id,則直接返回之前的執行結果,不做任何操作。這樣可以在最大程度上避免操作的重複執行問題,快取起來的執行結果也能用於事務的控制等。

總結

冪等性是分散式領域的一把利刃,每一個有志與分散式領域的程式設計師都應該熟悉它的設計思想。

相關推薦

訊息重複處理---

概述 冪等性原本是數學上的概念,即使公式:f(x)=f(f(x)) 能夠成立的數學性質。用在程式設計領域,則意為對同一個系統,使用同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的。 冪等性是分散式系統設計中十分重要的概念,具有這一性質的介面在設計時總是秉持這樣

如何保證訊息不被重複消費?或者說,如何保證訊息消費的

面試題 如何保證訊息不被重複消費?或者說,如何保證訊息消費的冪等性? 面試官心理分析 其實這是很常見的一個問題,這倆問題基本可以

一道面試題 訊息中介軟體,怎麼解決訊息(訊息怎麼防止不被重複消費)

訊息中介軟體中,怎麼解決訊息的冪等性(訊息消費怎麼防止不被重複消費。) 如果SpringBoot和ActiveMQ整合,程式碼不拋異常,標識為消費成。 ActiveMQ 消費程式碼丟擲異常,就會一直重試(10次)。 消費者端丟擲異常,怎麼解決 日誌mongdb(json)、redis、資

rabbitmq系列(三)訊息處理

一、springboot整合rabbitmq 我們需要新建兩個工程,一個作為生產者,另一個作為消費者。在pom.xml中新增amqp依賴: <dependency> <groupId>org.springframework.boot</groupId>

【面試寶典】訊息佇列如何保證

面試題:那麼來說稅如何保證訊息佇列的冪等性? 面試官心理剖析: 主要是看你對訊息佇列資料重複消費的問題,是否有了解,是否知道怎麼解決?如果這塊不知道,那麼面試官會覺得如果交給你做功能,可能會出現多次消費的情況。 為什麼會出現重複消費? 問題解決參考http://www.wityx.com/d

如何保證訊息佇列的高可用和以及資料丟失,順序一致性

如何保證訊息佇列的高可用和冪等性以及資料丟失,順序一致性 <!-- more --> RabbitMQ的高可用性 RabbitMQ是比較有代表性的,因為是基於主從做高可用性的,我們就以他為例子講解第一種MQ的高可用性怎麼實現。 rabbitmq有三種模式: 單機模式 普通叢集模

34、分散式服務介面的如何設計(比如不能重複扣款)?

1、面試題 分散式服務介面的冪等性如何設計(比如不能重複扣款)? 2、面試官心裡分析 從這個問題開始,面試官就已經進入了實際的生產問題的面試了。 一個分散式系統中的某個介面,要保證冪等性,該如何保證?這個事兒其實是你做分散式系統的時候必須要考慮的一個生產環境的技術問題。啥意思呢?

ASP.NET WebApi服務介面如何防止重複請求實現HTTP(八)

一、背景描述與課程介紹 明人不說暗話,跟著阿笨一起玩WebApi。在我們平時開發專案中可能會出現下面這些情況; 1)、由於使用者誤操作,多次點選網頁表單提交按鈕。由於網速等原因造成頁面卡頓,使用者重複重新整理提交頁面。黑客或惡意使用者使用postman等工具重複惡意提交表單(攻擊網站)。這些情況都會導

如何處理介面問題

在微服務架構下,我們在完成一個訂單流程時經常遇到下面的場景: 一個訂單建立介面,第一次呼叫超時了,然後呼叫方重試了一次在訂單建立時,我們需要去扣減庫存,這時介面發生了超時,呼叫方重試了一次當這筆訂單開始支付,在支付請求發出之後,在服務端發生了扣錢操作,介面響應超時了,呼

架構設計 | 介面原則,防重複提交Token管理

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent) # 一、冪等性概念 ## 1、冪等

什麽是分布式系統中的

數據操作 返回 另一個 tid 訂單 增加 簡單的 事務 既然 最近很多人都在談論冪等性,好吧,這回我也來聊聊這個話題,光看著倆字,一開始的確有點一頭霧水,語文不好嘛,詞太專業嘛,對吧 現如今我們的系統大多拆分為分布式SOA,或者微服務,一套系統中包含了多個子系統服務,

分布式系統互斥問題的分析與解決

解決沖突 ldr 隊列 reads failure 是的 最大 循環鏈表 成員變量 前言 隨著互聯網信息技術的飛速發展,數據量不斷增大,業務邏輯也日趨復雜,對系統的高並發訪問、海量數據處理的場景也越來越多。如何用較低成本實現系統的高可用、易伸縮、可擴展等目標就顯得越發重要。

何謂

服務 post put delete 會有 結果 但是 請求 數據 對同一個資源,不管請求多少次,結果都是一樣的。 如在resful接口中, get 、delete,put ,請求 1次與n次,結果都是相等的。 而對於post ,每次都是新增一條數據,則不符合冪等性,但是可

理解HTTP

重要性 動態網頁 true http post rom 放心 業務 定義 rop FROM http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html 基於HTTP協議的Web A

由表單重復提交引發的思考

思路 電商 完成後 cor 實現接口 延遲 策略 rom 是否 最近在本地開發測試的時候,遇到一個表單重復提交的現象。其實原因很簡單,因為網絡延遲的問題,我點擊了兩次提交按鈕,數據庫裏生成了兩條記錄。其實這種現象以前也有遇到過,一般都是提交後把按鈕置灰,無法再次提交,這是很

高並發下接口解決方案

困難 不同 同時 ont set 參數 交付 任務 數量 一、冪等性概念 在編程中.一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重復執行,並能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重復執行

服務高可用:設計

不一致 什麽是 自動 原因 冪等性 src 技術分享 信息 網絡故障 什麽是冪等性? 一般在服務調用時,讀服務如果調用失敗了,會自動按配置次數轉移到別的服務上去請求。而寫服務就不能重復請求,如果因為超時或者網絡故障等原因被調用服務並沒有返回成功的響應,服務調用方就認為是失

理解http的

比較 第一次 接收 出現問題 做到 的區別 重復提交 都沒有 在操作 冪等性是什麽? 冪等性——是系統的接口對外一種承諾(而不是實現),承諾只要調用接口成功,外部多次調用對系統的影響是一致的。一個冪等的操作典型如:把編號為5的記錄的A字段設置為0,這種操作不管執行多少次都是

什麼是服務的設計

什麼是冪等性? 一般在服務呼叫時,讀服務如果呼叫失敗了,會自動按配置次數轉移到別的服務上去請求。而寫服務就不能重複請求,如果因為超時或者網路故障等原因被呼叫服務並沒有返回成功的響應,服務呼叫方就認為是失敗了,但很有可能的是已經成功了,如果繼續重複請求寫服務,如轉賬類的服務,可能會造成嚴重的後果。

業務方案設計

冪等概念: 冪等(idempotent、idempotence)是一個數學與計算機學概念,常見於抽象代數中。 在程式設計中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也