分布式系統開發裡必須要解決的3個技術問題

2022-03-26 14:19:38 字數 2519 閱讀 2611

以前跟開發提過很多次,今天又有人出錯了,看樣子不經常提不行

這裡記錄一下,看到的開發人員都注意一下:

這3個問題經常出現,不解決的話,一定會造成經濟損失的

1、同乙個請求被傳送了多次

可能出現的地方:(1)和別人介面對接,別人同乙份資料傳送了多次

(2)使用者在「提交」按鈕裡點選了多次

(3) 其他可能的一些惡意呼叫,尤其是涉及支付環節的,危險性非常大

解決辦法:   (1)  在網頁端,使用者點選「提交」後,將按鈕disable掉

(2) 對於收到的資料插入到資料庫或者其他一些地方,做好唯一鍵控制

能夠確定唯一的:訂單號,或者幾個字段拼湊在一起,或者把時間考慮進去,精確到分鐘。整個md5一次,放到乙個欄位裡,加個唯一鍵

2、同一秒內有多次請求

這個就是併發控制,涉及到**等等需要控制到數量的地方,控制不好,會出現**抽多了,賣東西賣超了等情況

出現的原因也很清晰,同一秒內收到多個請求,分布式的,可能不同的請求會分布到不同的機器或者程式上去執行,都去讀取一下計數器(記錄賣的數量),比如:1,每個請求都各自執行讀取操作,發現都是1,沒有超出1的限制,然後都來修改計數器為0,然後各自都去發貨或者傳送獎品,結果造成了賣超。

解決辦法:

//欄位a裡儲存的是計數器數字,控制最多獎品數量,1個獎品和多個獎品的邏輯有點不一樣,注意下面的偽**

// 如果是1個獎品

select a from 欄位b;

$a = a;

if ( $a == 1)

// 如果是n個獎品

select a from 欄位b;

$a = a;

if ( $a <= n)

3、分布式系統裡的超時控制

如果有這樣乙個分布式業務:使用者購買東西,扣錢成功後發貨,發貨失敗的話,退錢給使用者

如果a負責處理業務邏輯

b負責扣錢      c負責發貨    d負責退錢

正常邏輯1:a呼叫 b扣錢成功的話,c發貨

正常邏輯2:a呼叫b扣錢,扣錢成功,呼叫c發貨,c發貨失敗,呼叫d退錢

那麼a呼叫c的超時時間一定要足夠大,大於c處理發貨的時間

否則會出現一種情況:

a呼叫c發貨,超時了,a以為發貨失敗了,呼叫d給別人退錢了,結果c發貨是成功的,d也把錢退了

所以a呼叫c發貨的系統超時時間一定要遠遠大於c處理發貨的最大時間

以前跟開發提過很多次,今天又有人出錯了,看樣子不經常提不行

這裡記錄一下,看到的開發人員都注意一下:

這3個問題經常出現,不解決的話,一定會造成經濟損失的

1、同乙個請求被傳送了多次

可能出現的地方:(1)和別人介面對接,別人同乙份資料傳送了多次

(2)使用者在「提交」按鈕裡點選了多次

(3) 其他可能的一些惡意呼叫,尤其是涉及支付環節的,危險性非常大

解決辦法:   (1)  在網頁端,使用者點選「提交」後,將按鈕disable掉

(2) 對於收到的資料插入到資料庫或者其他一些地方,做好唯一鍵控制

能夠確定唯一的:訂單號,或者幾個字段拼湊在一起,或者把時間考慮進去,精確到分鐘。整個md5一次,放到乙個欄位裡,加個唯一鍵

2、同一秒內有多次請求

這個就是併發控制,涉及到**等等需要控制到數量的地方,控制不好,會出現**抽多了,賣東西賣超了等情況

出現的原因也很清晰,同一秒內收到多個請求,分布式的,可能不同的請求會分布到不同的機器或者程式上去執行,都去讀取一下計數器(記錄賣的數量),比如:1,每個請求都各自執行讀取操作,發現都是1,沒有超出1的限制,然後都來修改計數器為0,然後各自都去發貨或者傳送獎品,結果造成了賣超。

解決辦法:

//欄位a裡儲存的是計數器數字,控制最多獎品數量,1個獎品和多個獎品的邏輯有點不一樣,注意下面的偽**

// 如果是1個獎品

select a from 欄位b;

$a = a;

if ( $a == 1)

// 如果是n個獎品

select a from 欄位b;

$a = a;

if ( $a <= n)

3、分布式系統裡的超時控制

如果有這樣乙個分布式業務:使用者購買東西,扣錢成功後發貨,發貨失敗的話,退錢給使用者

如果a負責處理業務邏輯

b負責扣錢      c負責發貨    d負責退錢

正常邏輯1:a呼叫 b扣錢成功的話,c發貨

正常邏輯2:a呼叫b扣錢,扣錢成功,呼叫c發貨,c發貨失敗,呼叫d退錢

那麼a呼叫c的超時時間一定要足夠大,大於c處理發貨的時間

否則會出現一種情況:

a呼叫c發貨,超時了,a以為發貨失敗了,呼叫d給別人退錢了,結果c發貨是成功的,d也把錢退了

所以a呼叫c發貨的系統超時時間一定要遠遠大於c處理發貨的最大時間

分布式監控系統開發

本章內容 為什麼要做監控系統?熟悉it檢測系統的設計原理 開發乙個簡版的zabbix監控系統 掌握自動化開發專案的程式涉及的思路及架構解耦原理 主動監控 是監控伺服器主動向客戶端索要資料 好處 1 不需要安裝客戶端 如 snmp,ssh,ipmi 2 簡單 壞處 1 當客戶端過多的時候就會出現瓶頸 ...

分布式系統需要解決的幾大問題

架構演進中單體架構的高難度演進和技術公升級我可能沒有經歷過,目前很多場景很多需求,都需要分布式系統去解決,不過大多數情況下我們可能不需要使用分布式相關的服務,但是業務的發展可能需要我們提前了解相關的技術作為技術儲備,隨時迎難而上。本篇文章作為分布式理論的一篇隨筆完全自己手敲去理解分布式系統需要解決的...

粵嵌 嵌入式系統開發新手必須掌握的技能

嵌入式系統開發新手必須掌握的技能 1 對於從事嵌入式 嵌入式培訓 系統軟體開發的人來講,一般需要掌握以下基本技能 1 懂得c語言和一些簡單的組合語言程式設計。2 能夠閱讀一般嵌入式系統的原理圖。3 至少熟悉一種嵌入式系統的軟體開發環境。4 熟悉一種嵌入式系統軟體的開發過程,如 微控制器系統 dsp系...