成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

程序員,你怎么對(duì)待常見(jiàn)的數(shù)據(jù)一致性問(wèn)題?

Me_Kun / 3583人閱讀

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

現(xiàn)象

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

當(dāng)多個(gè)進(jìn)程同時(shí)操作同一個(gè)數(shù)據(jù),會(huì)產(chǎn)生資源爭(zhēng)搶?zhuān)瑪?shù)據(jù)一致性的問(wèn)題。

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

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

這樣一來(lái),數(shù)據(jù)一致性問(wèn)題就會(huì)變得越來(lái)越突出。

?

舉個(gè)栗子

我們來(lái)看這樣一個(gè)數(shù)據(jù)流程。

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

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

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

生成一個(gè)訂單/也可能會(huì)分拆為兩個(gè)訂單

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

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

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

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

?

思路

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

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

?

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

如果前后端都是一起的,也就沒(méi)有消息隊(duì)列。

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

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

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

?

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

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

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

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

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

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

?

那這些工作帶來(lái)的影響有哪些呢?

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

數(shù)據(jù)驗(yàn)證和重試帶來(lái)的性能下降

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

二次檢查再次增加復(fù)雜度和額外開(kāi)銷(xiāo)

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

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

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

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

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

但是在一些促銷(xiāo)活動(dòng)的時(shí)候,肯定還是會(huì)遇到下單等待太久的問(wèn)題。

?

瓶頸

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

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

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

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

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

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

?

真相

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

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

比如:商城里面庫(kù)存超賣(mài),訂單狀態(tài)不一致等,也是因?yàn)闆](méi)有做到數(shù)據(jù)一致性。

之所以會(huì)這樣,因?yàn)橥度氘a(chǎn)出嚴(yán)重不成比例,是很無(wú)奈的選擇。

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

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

?

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

下面有幾個(gè)方法可以考慮:

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

一個(gè)每秒鐘上百萬(wàn)請(qǐng)求的應(yīng)用系統(tǒng)能不能分拆為1000個(gè)每秒鐘1000請(qǐng)求的獨(dú)立集群呢?

一個(gè)上百萬(wàn)的商家、商品、訂單庫(kù),能不能分拆為1000個(gè)只有1000個(gè)商家、商品、訂單的子庫(kù)呢?

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17829.html

相關(guān)文章

  • 序員,怎么對(duì)待常見(jiàn)數(shù)據(jù)致性問(wèn)題

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

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

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

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

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

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

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

    Jason 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<