成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Me_Kun / 3663人閱讀

摘要:當(dāng)多個進(jìn)程同時操作同一個數(shù)據(jù),會產(chǎn)生資源爭搶,數(shù)據(jù)一致性的問題。這樣一來,數(shù)據(jù)一致性問題就會變得越來越突出。但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。

現(xiàn)象

應(yīng)用系統(tǒng)中的關(guān)鍵服務(wù)絕大部分都會是對數(shù)據(jù)庫的依賴。
?

當(dāng)多個進(jìn)程同時操作同一個數(shù)據(jù),會產(chǎn)生資源爭搶,數(shù)據(jù)一致性的問題。

如果只有一個數(shù)據(jù)庫服務(wù)器,數(shù)據(jù)一致性問題也就不存在了。

可是,隨著系統(tǒng)訪問量、數(shù)據(jù)量的不斷增長,數(shù)據(jù)庫出現(xiàn)多個服務(wù)器,又出現(xiàn)緩存服務(wù),又要拆分?jǐn)?shù)據(jù)庫,還要分拆到不同的子應(yīng)用等等。

這樣一來,數(shù)據(jù)一致性問題就會變得越來越突出。

?

舉個栗子

我們來看這樣一個數(shù)據(jù)流程。

用戶提交一個訂單(2個不同商家各一件商品)——數(shù)據(jù)源頭

應(yīng)用服務(wù)器驗證用戶信息、訂單信息、庫存信息等等,然后將這個訂單發(fā)送到訂單消息隊列——消息隊列

訂單處理服務(wù)器從消息隊列中拿到新訂單,接下來的處理,可能做的數(shù)據(jù)操作有:

生成一個訂單/也可能會分拆為兩個訂單

更新兩個商品庫存數(shù)量

更新商家的銷售數(shù)據(jù)

生成訂單對應(yīng)的支付信息

生成用戶訂單成功的狀態(tài)信息

?

思路

上面的數(shù)據(jù)處理中,涉及到的數(shù)據(jù)有:訂單數(shù)據(jù)、商品數(shù)據(jù)、商家數(shù)據(jù)、支付數(shù)據(jù)、用戶數(shù)據(jù)。

涉及到的應(yīng)用和服務(wù)有:前端應(yīng)用系統(tǒng),消息隊列,后端應(yīng)用系統(tǒng),數(shù)據(jù)庫,緩存,甚至訂單、商品、商家、支付、用戶可能都是獨立的子應(yīng)用。

?

可能大部分系統(tǒng)不會像上面這么龐大。

如果前后端都是一起的,也就沒有消息隊列。

如果也沒有這些子系統(tǒng),數(shù)據(jù)庫是集中的,那可能數(shù)據(jù)一致性問題會稍微小些。

這時候,只需要注意數(shù)據(jù)庫更新的一致性就好了,比較容易想到的應(yīng)對方法,就是用數(shù)據(jù)庫事務(wù)來保證。

如果這些數(shù)據(jù)不只是一份數(shù)據(jù)庫,還有緩存中一份,又要考慮緩存數(shù)據(jù)的更新,所以問題還是復(fù)雜了。

?

數(shù)據(jù)庫更新,怎么保證緩存也能正常更新呢?

程序中處理,數(shù)據(jù)庫更新后,就要馬上更新緩存數(shù)據(jù)

如果緩存更新失敗或者程序出現(xiàn)異常,要有異常處理方法

異常處理方法可以是程序中實時的糾正或者重試

異常處理方法也可以是針對數(shù)據(jù)庫的更新,二次檢查緩存數(shù)據(jù)的更新

這里還只是一個數(shù)據(jù)庫和一個緩存的情況,已經(jīng)要做出這么多事情。

?

那這些工作帶來的影響有哪些呢?

程序開發(fā)更加復(fù)雜,不能有些許的遺漏

數(shù)據(jù)驗證和重試帶來的性能下降

數(shù)據(jù)庫事務(wù)帶來的數(shù)據(jù)庫瓶頸明顯

二次檢查再次增加復(fù)雜度和額外開銷

本來一個訂單處理,如果不考慮數(shù)據(jù)一致性問題,數(shù)據(jù)庫寫入/更新5~10次,緩存寫入/更新5~10次,整個過程應(yīng)該在10ms內(nèi)完成。

但是加上數(shù)據(jù)庫事務(wù)之后,會把這些操作中涉及到的幾個表都加鎖,意味著數(shù)據(jù)的讀、寫都串行化了,整個應(yīng)用系統(tǒng)的并發(fā)能力急劇下降。

當(dāng)然,因為這里引入緩存,對數(shù)據(jù)庫的依賴會減少很多,而且還有從庫可以提供讀的服務(wù),應(yīng)用系統(tǒng)的訪問并發(fā)能力不至于下降太多。

但這些代價在交易處理中是難以避免的,為了解決數(shù)據(jù)一致性問題,犧牲的是訂單處理的并發(fā)能力。

對于大部分商城、網(wǎng)站,訂單并發(fā)量也不高,這類問題不太常發(fā)生,所以也就這么過去了。

但是在一些促銷活動的時候,肯定還是會遇到下單等待太久的問題。

?

瓶頸

為了具備更大并發(fā)的訂單處理能力,單數(shù)據(jù)庫、緩存肯定是行不通了。

那么要在這么多的子應(yīng)用、大量的數(shù)據(jù)庫、緩存服務(wù)中保持?jǐn)?shù)據(jù)一致性又要怎么做呢?

每個子應(yīng)用都要支持分布式事務(wù),共同保證數(shù)據(jù)庫全部成功更新

每個子應(yīng)用各自要保證自己的數(shù)據(jù)更新一致性(異常處理、重試、二次檢查等方法同上)

上面看上去只有兩條,但是要做的事情和困難會比上面要多十倍,難百倍。

看到這里,是不是對于數(shù)據(jù)一致性的問題都有點絕望了。

?

真相

正因如此,大部分的分布式系統(tǒng),大部分應(yīng)用,是沒有做到數(shù)據(jù)一致性,哪怕是弱一致性。

比如:論壇里面發(fā)帖,要更新10份左右的數(shù)據(jù),出現(xiàn)臟數(shù)據(jù)是常有的,這就是沒有做到數(shù)據(jù)一致性。

比如:商城里面庫存超賣,訂單狀態(tài)不一致等,也是因為沒有做到數(shù)據(jù)一致性。

之所以會這樣,因為投入產(chǎn)出嚴(yán)重不成比例,是很無奈的選擇。

數(shù)據(jù)不一致的情況畢竟比例極低,但是投入的代價卻極大。

數(shù)據(jù)不一致引發(fā)的后果,可以忍受和容忍,哪怕是發(fā)現(xiàn)后再修正。

?

那么,還有什么辦法可以避免或減少出現(xiàn)數(shù)據(jù)一致性問題呢?

下面有幾個方法可以考慮:

將系統(tǒng)規(guī)模和容量降低,保證系統(tǒng)的穩(wěn)定性和高效;

一個每秒鐘上百萬請求的應(yīng)用系統(tǒng)能不能分拆為1000個每秒鐘1000請求的獨立集群呢?

一個上百萬的商家、商品、訂單庫,能不能分拆為1000個只有1000個商家、商品、訂單的子庫呢?

將數(shù)據(jù)關(guān)聯(lián)降低,減少更新次數(shù),減少不一致問題的出現(xiàn)概率;

上面的訂單、庫存、商家、支付、用戶幾個數(shù)據(jù),核心數(shù)據(jù)只有訂單,其他的幾個數(shù)據(jù)完全可以從訂單數(shù)據(jù)推導(dǎo)出來,減少訂單處理中的一致性要求。

將應(yīng)用分拆,對性能和一致性要求高的應(yīng)用獨立實現(xiàn);

減少業(yè)務(wù)耦合,集中資源重點投入。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/17829.html

相關(guān)文章

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

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

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

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

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

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

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

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

    Jason 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<