摘要:當多個進程同時操作同一個數(shù)據(jù),會產生資源爭搶,數(shù)據(jù)一致性的問題。這樣一來,數(shù)據(jù)一致性問題就會變得越來越突出。但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。
現(xiàn)象
應用系統(tǒng)中的關鍵服務絕大部分都會是對數(shù)據(jù)庫的依賴。
?
當多個進程同時操作同一個數(shù)據(jù),會產生資源爭搶,數(shù)據(jù)一致性的問題。
如果只有一個數(shù)據(jù)庫服務器,數(shù)據(jù)一致性問題也就不存在了。
可是,隨著系統(tǒng)訪問量、數(shù)據(jù)量的不斷增長,數(shù)據(jù)庫出現(xiàn)多個服務器,又出現(xiàn)緩存服務,又要拆分數(shù)據(jù)庫,還要分拆到不同的子應用等等。
這樣一來,數(shù)據(jù)一致性問題就會變得越來越突出。
?
舉個栗子我們來看這樣一個數(shù)據(jù)流程。
用戶提交一個訂單(2個不同商家各一件商品)——數(shù)據(jù)源頭
應用服務器驗證用戶信息、訂單信息、庫存信息等等,然后將這個訂單發(fā)送到訂單消息隊列——消息隊列
訂單處理服務器從消息隊列中拿到新訂單,接下來的處理,可能做的數(shù)據(jù)操作有:
生成一個訂單/也可能會分拆為兩個訂單
更新兩個商品庫存數(shù)量
更新商家的銷售數(shù)據(jù)
生成訂單對應的支付信息
生成用戶訂單成功的狀態(tài)信息
?
思路上面的數(shù)據(jù)處理中,涉及到的數(shù)據(jù)有:訂單數(shù)據(jù)、商品數(shù)據(jù)、商家數(shù)據(jù)、支付數(shù)據(jù)、用戶數(shù)據(jù)。
涉及到的應用和服務有:前端應用系統(tǒng),消息隊列,后端應用系統(tǒng),數(shù)據(jù)庫,緩存,甚至訂單、商品、商家、支付、用戶可能都是獨立的子應用。
?
可能大部分系統(tǒng)不會像上面這么龐大。
如果前后端都是一起的,也就沒有消息隊列。
如果也沒有這些子系統(tǒng),數(shù)據(jù)庫是集中的,那可能數(shù)據(jù)一致性問題會稍微小些。
這時候,只需要注意數(shù)據(jù)庫更新的一致性就好了,比較容易想到的應對方法,就是用數(shù)據(jù)庫事務來保證。
如果這些數(shù)據(jù)不只是一份數(shù)據(jù)庫,還有緩存中一份,又要考慮緩存數(shù)據(jù)的更新,所以問題還是復雜了。
?
數(shù)據(jù)庫更新,怎么保證緩存也能正常更新呢?程序中處理,數(shù)據(jù)庫更新后,就要馬上更新緩存數(shù)據(jù)
如果緩存更新失敗或者程序出現(xiàn)異常,要有異常處理方法
異常處理方法可以是程序中實時的糾正或者重試
異常處理方法也可以是針對數(shù)據(jù)庫的更新,二次檢查緩存數(shù)據(jù)的更新
這里還只是一個數(shù)據(jù)庫和一個緩存的情況,已經要做出這么多事情。
?
那這些工作帶來的影響有哪些呢?程序開發(fā)更加復雜,不能有些許的遺漏
數(shù)據(jù)驗證和重試帶來的性能下降
數(shù)據(jù)庫事務帶來的數(shù)據(jù)庫瓶頸明顯
二次檢查再次增加復雜度和額外開銷
本來一個訂單處理,如果不考慮數(shù)據(jù)一致性問題,數(shù)據(jù)庫寫入/更新5~10次,緩存寫入/更新5~10次,整個過程應該在10ms內完成。
但是加上數(shù)據(jù)庫事務之后,會把這些操作中涉及到的幾個表都加鎖,意味著數(shù)據(jù)的讀、寫都串行化了,整個應用系統(tǒng)的并發(fā)能力急劇下降。
當然,因為這里引入緩存,對數(shù)據(jù)庫的依賴會減少很多,而且還有從庫可以提供讀的服務,應用系統(tǒng)的訪問并發(fā)能力不至于下降太多。
但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。
對于大部分商城、網站,訂單并發(fā)量也不高,這類問題不太常發(fā)生,所以也就這么過去了。
但是在一些促銷活動的時候,肯定還是會遇到下單等待太久的問題。
?
瓶頸為了具備更大并發(fā)的訂單處理能力,單數(shù)據(jù)庫、緩存肯定是行不通了。
那么要在這么多的子應用、大量的數(shù)據(jù)庫、緩存服務中保持數(shù)據(jù)一致性又要怎么做呢?
每個子應用都要支持分布式事務,共同保證數(shù)據(jù)庫全部成功更新
每個子應用各自要保證自己的數(shù)據(jù)更新一致性(異常處理、重試、二次檢查等方法同上)
上面看上去只有兩條,但是要做的事情和困難會比上面要多十倍,難百倍。
看到這里,是不是對于數(shù)據(jù)一致性的問題都有點絕望了。
?
真相正因如此,大部分的分布式系統(tǒng),大部分應用,是沒有做到數(shù)據(jù)一致性,哪怕是弱一致性。
比如:論壇里面發(fā)帖,要更新10份左右的數(shù)據(jù),出現(xiàn)臟數(shù)據(jù)是常有的,這就是沒有做到數(shù)據(jù)一致性。
比如:商城里面庫存超賣,訂單狀態(tài)不一致等,也是因為沒有做到數(shù)據(jù)一致性。
之所以會這樣,因為投入產出嚴重不成比例,是很無奈的選擇。
數(shù)據(jù)不一致的情況畢竟比例極低,但是投入的代價卻極大。
數(shù)據(jù)不一致引發(fā)的后果,可以忍受和容忍,哪怕是發(fā)現(xiàn)后再修正。
?
那么,還有什么辦法可以避免或減少出現(xiàn)數(shù)據(jù)一致性問題呢?下面有幾個方法可以考慮:
將系統(tǒng)規(guī)模和容量降低,保證系統(tǒng)的穩(wěn)定性和高效;
一個每秒鐘上百萬請求的應用系統(tǒng)能不能分拆為1000個每秒鐘1000請求的獨立集群呢?
一個上百萬的商家、商品、訂單庫,能不能分拆為1000個只有1000個商家、商品、訂單的子庫呢?
將數(shù)據(jù)關聯(lián)降低,減少更新次數(shù),減少不一致問題的出現(xiàn)概率;
上面的訂單、庫存、商家、支付、用戶幾個數(shù)據(jù),核心數(shù)據(jù)只有訂單,其他的幾個數(shù)據(jù)完全可以從訂單數(shù)據(jù)推導出來,減少訂單處理中的一致性要求。
將應用分拆,對性能和一致性要求高的應用獨立實現(xiàn);
減少業(yè)務耦合,集中資源重點投入。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17829.html
摘要:當多個進程同時操作同一個數(shù)據(jù),會產生資源爭搶,數(shù)據(jù)一致性的問題。這樣一來,數(shù)據(jù)一致性問題就會變得越來越突出。但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。 現(xiàn)象 應用系統(tǒng)中的關鍵服務絕大部分都會是對數(shù)據(jù)庫的依賴。? 當多個進程同時操作同一個數(shù)據(jù),會產生資源爭搶,數(shù)據(jù)一致性的問題。 如果只有一個數(shù)據(jù)庫服務器,數(shù)據(jù)一致性問題也就不存在了。 可是,隨...
摘要:前端最基礎的就是。數(shù)據(jù)被編碼為鍵值對。大法好,精準識別,也算是正確的表單提交。全局的默認值實例默認值創(chuàng)建實例時設置配置的默認值在實例已創(chuàng)建后修改默認值攔截器,可以攔截錯誤,進行上報。參考資料類型看云 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水...
摘要:前端最基礎的就是。數(shù)據(jù)被編碼為鍵值對。大法好,精準識別,也算是正確的表單提交。全局的默認值實例默認值創(chuàng)建實例時設置配置的默認值在實例已創(chuàng)建后修改默認值攔截器,可以攔截錯誤,進行上報。參考資料類型看云 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水...
摘要:為了構建可伸縮的測試自動化框架,需要記住以下三個最重要的干凈編碼實踐。因此,組織期望其或測試自動化架構師設計和開發(fā)健壯,可維護的智能測試自動化框架。包括適當?shù)奈臋n在測試自動化框架開發(fā)項目中工作的程序員不太可能獨自編寫代碼。 ...
閱讀 1342·2021-11-25 09:43
閱讀 1902·2021-11-12 10:36
閱讀 6002·2021-09-22 15:05
閱讀 3485·2019-08-30 15:55
閱讀 2012·2019-08-26 14:06
閱讀 3645·2019-08-26 12:17
閱讀 504·2019-08-23 17:55
閱讀 2456·2019-08-23 16:23