国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

程序員,你怎么對待常見的數(shù)據(jù)一致性問題?

Me_Kun / 3579人閱讀

摘要:當多個進程同時操作同一個數(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ù)一致性問題就會變得越來越突出。但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。 現(xiàn)象 應用系統(tǒng)中的關鍵服務絕大部分都會是對數(shù)據(jù)庫的依賴。? 當多個進程同時操作同一個數(shù)據(jù),會產生資源爭搶,數(shù)據(jù)一致性的問題。 如果只有一個數(shù)據(jù)庫服務器,數(shù)據(jù)一致性問題也就不存在了。 可是,隨...

    keelii 評論0 收藏0
  • 前端培訓-初級階段-場景實戰(zhàn)(2019-06-06)-Content-Type對照表及日常使用

    摘要:前端最基礎的就是。數(shù)據(jù)被編碼為鍵值對。大法好,精準識別,也算是正確的表單提交。全局的默認值實例默認值創(chuàng)建實例時設置配置的默認值在實例已創(chuàng)建后修改默認值攔截器,可以攔截錯誤,進行上報。參考資料類型看云 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水...

    mayaohua 評論0 收藏0
  • 前端培訓-初級階段-場景實戰(zhàn)(2019-06-06)-Content-Type對照表及日常使用

    摘要:前端最基礎的就是。數(shù)據(jù)被編碼為鍵值對。大法好,精準識別,也算是正確的表單提交。全局的默認值實例默認值創(chuàng)建實例時設置配置的默認值在實例已創(chuàng)建后修改默認值攔截器,可以攔截錯誤,進行上報。參考資料類型看云 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水...

    張金寶 評論0 收藏0
  • 怎樣構建測試自動化框架?得記住以下三個編碼實踐!

    摘要:為了構建可伸縮的測試自動化框架,需要記住以下三個最重要的干凈編碼實踐。因此,組織期望其或測試自動化架構師設計和開發(fā)健壯,可維護的智能測試自動化框架。包括適當?shù)奈臋n在測試自動化框架開發(fā)項目中工作的程序員不太可能獨自編寫代碼。 ...

    Jason 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<