javaweb對於高併發策略 快取

2021-08-15 02:17:49 字數 1481 閱讀 9575

前言

在系統開發過程中,經常遇到資料重複插入、重複更新、訊息重發傳送等等問題,因為應用系統的複雜邏輯以及網路互動存在的不確定性,會導致這一重複現象,但是有些邏輯是需要有冪等特性的,否則造成的後果會比較嚴重,例如訂單重複建立,這時候帶來的問題可是非同一般啊。

什麼是系統的冪等性

冪等是資料中得乙個概念,表示n次變換和1次變換的結果相同。

高併發的系統如何保證冪等性?

1.查詢

查詢的api,可以說是天然的冪等性,因為你查詢一次和查詢兩次,對於系統來講,沒有任何資料的變更,所以,查詢一次和查詢多次一樣的。

2.mvcc方案

多版本併發控制,update with condition,更新帶條件,這也是在系統設計的時候,合理的選擇樂觀鎖,通過version或者其他條件,來做樂觀鎖,這樣保證更新及時在併發的情況下,也不會有太大的問題。

例如:update table_*** set name=#name#,version=version+1 where version=#version# ,或者是 update table_*** set quality=quality-#subquality# where quality-#subquality# >= 0 。

3.單獨的去重表

如果涉及到的去重的地方特別多,例如erp系統中有各種各樣的業務單據,每一種業務單據都需要去重,這時候,可以單獨搞一張去重表,在插入資料的時候,插入去重表,利用資料庫的唯一索引特性,保證唯一的邏輯。

4.分布式鎖

還是拿插入資料的例子,如果是分布是系統,構建唯一索引比較困難,例如唯一性的字段沒法確定,這時候可以引入分布式鎖,通過第三方的系統,在業務系統插入資料或者更新資料,獲取分布式鎖,然後做操作,之後釋放鎖,這樣其實是把多執行緒併發的鎖的思路,引入多多個系統,也就是分布式系統中得解決思路。

5.刪除資料

刪除資料,僅僅第一次刪除是真正的運算元據,第二次甚至第三次刪除,直接返回成功,這樣保證了冪等。

6.插入資料的唯一索引

插入資料的唯一性,可以通過業務主鍵來進行約束,例如乙個特定的業務場景,三個字段肯定確定唯一性,那麼,可以在資料庫表新增唯一索引來進行標示。

這裡有乙個場景,api層面的冪等,例如提交資料,如何控制重複提交,這裡可以在提交資料的form表單或者客戶端軟體,增加乙個唯一標示,然後服務端,根據這個uuid來進行去重,這樣就能比較好的做到api層面的唯一標識。

7.狀態機冪等

在設計單據相關的業務,或者是任務相關的業務,肯定會涉及到狀態機,就是業務單據上面有個狀態,狀態在不同的情況下會發生變更,一般情況下存在有限狀態機,這時候,如果狀態機已經處於下乙個狀態,這時候來了乙個上乙個狀態的變更,理論上是不能夠變更的,這樣的話,保證了有限狀態機的冪等。

高併發策略(六)超時重試

合理設定超時很重要,不然可能會引起連鎖變慢 讀 天然重試 寫 如訂單不合適 但對於冪等性的可以 重試次數過多 模擬ddos攻擊 web應用 服務應用 網路連線讀寫 超時與重試 haproxy nginx twemproxy redis分片 web容器超時 tomcat jetty 中介軟體 soa ...

對於高併發呼叫TOP的回答

乙個開發者的疑問 應用程式會呼叫top的api去執行任務,首先根據單個任務執行時間很長,其次在使用者量增加的時候執行緒併發量很大,出現連線重置等網路問題。回答 1.合理切割任務,將任務粒度放小,減小事務時間,提高事務執行成功率,降低回滾代價。2.合併任務中重複的內容,在時間間隔容許的範圍內,減少可能...

對於高併發呼叫TOP的回答

乙個開發者的疑問 應用程式會呼叫top的api去執行任務,首先根據單個任務執行時間很長,其次在使用者量增加的時候執行緒併發量很大,出現連線重置等網路問題。回答 1.合理切割任務,將任務粒度放小,減小事務時間,提高事務執行成功率,降低回滾代價。2.合併任務中重複的內容,在時間間隔容許的範圍內,減少可能...