成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

張開濤:回滾機(jī)制詳解

開發(fā) 開發(fā)工具
回滾最常見的如事務(wù)回滾、代碼庫(kù)回滾、部署版本回滾、數(shù)據(jù)版本回滾、靜態(tài)資源版本回滾等。通過回滾機(jī)制保證系統(tǒng)某些場(chǎng)景下的高可用。

回滾是指當(dāng)程序或數(shù)據(jù)出錯(cuò)時(shí),將程序或數(shù)據(jù)恢復(fù)到最近一個(gè)正確版本的行為。最常見的如事務(wù)回滾、代碼庫(kù)回滾、部署版本回滾、數(shù)據(jù)版本回滾、靜態(tài)資源版本回滾等。通過回滾機(jī)制保證系統(tǒng)某些場(chǎng)景下的高可用。

一、事務(wù)回滾

在執(zhí)行數(shù)據(jù)庫(kù)SQL時(shí),如果我們檢測(cè)到事務(wù)提交沖突,那么事務(wù)中的所有已執(zhí)行的SQL要進(jìn)行回滾,目的是防止數(shù)據(jù)庫(kù)出現(xiàn)數(shù)據(jù)不一致。對(duì)于單庫(kù)事務(wù)回滾直接使用相關(guān)SQL即可。如果涉及到分布式數(shù)據(jù)庫(kù),則要考慮使用分布式事務(wù),最常見的如兩階段提交、三階段提交協(xié)議,這種方式實(shí)現(xiàn)事務(wù)難度較低,但是,對(duì)性能影響比較大,因?yàn)槲覀兇蠖鄶?shù)場(chǎng)景需要的是最終一致性,而不是強(qiáng)一致性。因此,可以考慮如事務(wù)表、消息隊(duì)列、補(bǔ)償機(jī)制(執(zhí)行/回滾)、TCC模式(預(yù)占/確認(rèn)/取消)、Sagas模式(拆分事務(wù)+補(bǔ)償機(jī)制)等實(shí)現(xiàn)最終一致性。比如,電商下單場(chǎng)景,會(huì)進(jìn)行扣減優(yōu)惠券、預(yù)占庫(kù)存等操作,這涉及到非常多的子系統(tǒng),因此,很難使用分布式事務(wù)保證強(qiáng)一致性,我們只要能保證最終一致性即可,來看下結(jié)算下單序列圖。

結(jié)算下單序列圖

一種情況是當(dāng)訂單出錯(cuò)后,要把之前扣減的優(yōu)惠券和庫(kù)存回滾。但是,當(dāng)保存訂單出錯(cuò)時(shí),JVM實(shí)例掛掉了,那么之前扣減的優(yōu)惠券和庫(kù)存就沒有回滾,這種情況可以考慮在本地記錄事務(wù)日志,當(dāng)JVM實(shí)例重啟后,分析事務(wù)日志重新回滾,當(dāng)然也可以記錄事務(wù)日志表,或者通過補(bǔ)償機(jī)制,定期掃描優(yōu)惠券和庫(kù)存使用表,回滾沒有關(guān)聯(lián)訂單的或者已取消訂單的記錄。還有一種情況是下單后一直沒有支付,比如6小時(shí),沒有支付訂單要取消訂單,此時(shí)就要定期掃描訂單表,然后取消訂單并回滾優(yōu)惠券和庫(kù)存。不管用什么方式,只要保證最終一致性即可。

二、代碼庫(kù)回滾

在開發(fā)項(xiàng)目時(shí),一定要將代碼維護(hù)到代碼倉(cāng)庫(kù),從而能進(jìn)行版本管理。常見的有SVN、GIT等,SVN是一款集中版本控制系統(tǒng),而GIT是一款分布式版本控制系統(tǒng)。有了版本控制系統(tǒng)后就可以記錄代碼的歷史版本,從而出問題后可以方便回滾。當(dāng)某個(gè)代碼文件部署出現(xiàn)問題時(shí),可以通過歷史版本查看是誰修改的、修改了什么,從而快速定位出BUG。另外,在實(shí)際開發(fā)過程中,可能存在多個(gè)版本并行開發(fā),此時(shí)版本控制系統(tǒng)的分支功能就發(fā)揮大作用了,大家在各自分支上開發(fā)測(cè)試,相互不影響,開發(fā)完成后合并分支到主干即可。

三、部署版本回滾

代碼測(cè)試完成后,接下來就要進(jìn)行系統(tǒng)的部署,在部署系統(tǒng)時(shí),要考慮當(dāng)代碼邏輯出現(xiàn)錯(cuò)誤后如何快速恢復(fù),總結(jié)為部署版本化,小版本增量發(fā)布,大版本灰度發(fā)布,架構(gòu)升級(jí)并發(fā)發(fā)布。

1. 部署版本化

每次部署時(shí),應(yīng)該將上一版本的包記錄到部署系統(tǒng)中,在發(fā)布時(shí)應(yīng)該采用全量發(fā)布,避免增量發(fā)布(只發(fā)布修改過的類或文件),全量版本后回滾直接回滾即可,不會(huì)受到一些約束或限制。

2. 小版本增量發(fā)

比如修復(fù)BUG,添加一些簡(jiǎn)單的業(yè)務(wù)邏輯,這些我們叫做小版本。增量發(fā)的意思是比如我們有100臺(tái)服務(wù)器,先發(fā)1臺(tái)驗(yàn)證,如果沒問題,則接著發(fā)10臺(tái),***全量發(fā)。

3.大版本灰度發(fā)

比如頁面改版,添加新的功能此時(shí)需要灰度發(fā)布,一般情況下是兩個(gè)版本并行跑一段時(shí)間,一些用戶訪問老版本,一些用戶訪問新版本,功能驗(yàn)證成功后或者新版效果不錯(cuò)再全量發(fā)布。比如,我們可以通過類似于如下URL中帶有版本號(hào)來區(qū)分新版還是老版。

https://cd.jd.com/yanbao/v3?skuId=854073&cat=652,654,832&brandId=8983&area=1_2810_51081_0&callback=yanbao_jsonp_callback

不同版本其實(shí)就是不同的服務(wù),在一套集群部署即可,出問題時(shí)要能非??焖俚厍袚Q回老版本。

4. 架構(gòu)升級(jí)并發(fā)發(fā)布

架構(gòu)升級(jí)后,我們不太清楚新版本是否功能正常,因此,新老版部署集群會(huì)同時(shí)存在一段時(shí)間。然后,等所有流量遷移到新版本集群后,老版本集群就可以下線了。

架構(gòu)升級(jí)并發(fā)發(fā)布

一般前端應(yīng)用我們會(huì)采用Nginx作為接入層,通過AB方式慢慢將流量引入到新版本集群,比如1%、10%、50%、100%。如果新版本集群處理出現(xiàn)問題,那么要自動(dòng)降級(jí)到老版本集群繼續(xù)服務(wù),當(dāng)新版本出現(xiàn)大面積故障,要將所有流量引入到老版本集群。因此,接入層要能靈活控制流量方向。

失敗降級(jí)我們可以借助Nginx的error_page。

  1. proxy_intercept_errors on; 
  2. recursive_error_pages on; 
  3.   
  4. location ~* "^/(\d+)\.html$" { 
  5.    proxy_pass http://new_version/$1.html; 
  6.    error_page 500 502 503 504 =200 /fallback_version/$1.html; 

失敗降級(jí)是很重要的特性,關(guān)鍵時(shí)候不至于用戶不能訪問或者看到白屏,如果有CDN時(shí),則切換版本時(shí)一定記得去掉CDN。

四、數(shù)據(jù)版本回滾

有些特定行業(yè)業(yè)務(wù)數(shù)據(jù)中的商品/價(jià)格數(shù)據(jù)需要進(jìn)行版本化處理,一方面為了審計(jì)需要,另一方面為了出現(xiàn)問題時(shí)能及時(shí)回滾。版本化設(shè)計(jì)時(shí)可以基于下圖架構(gòu)。

版本化數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)時(shí),有兩種思路:全量和增量。全量版本化是指即使只變更了其中一個(gè)字段也將整體記錄進(jìn)行歷史版本化,保持的數(shù)據(jù)量比較多,但是回滾方便。而增量是指只保存變化的字段,保存的數(shù)據(jù)量較少,但是回滾起來很麻煩,需要回溯。因此,為了簡(jiǎn)單化處理一般采用全量版本化機(jī)制。

另外,在設(shè)計(jì)消息隊(duì)列時(shí),重要業(yè)務(wù)會(huì)對(duì)消息進(jìn)行副本處理,以便萬一業(yè)務(wù)邏輯出現(xiàn)問題能進(jìn)行歷史數(shù)據(jù)回放,從而修復(fù)問題。

五、靜態(tài)資源版本回滾

在前端開發(fā)時(shí),靜態(tài)資源版本也是會(huì)經(jīng)常變更的,如JS/CSS,而每次內(nèi)容變更時(shí)我們都會(huì)生成一個(gè)全量新版本放到項(xiàng)目的deploy目錄中,從而能保證版本可追溯,出現(xiàn)問題時(shí)能及時(shí)回滾。

靜態(tài)資源版本回滾

因?yàn)殪o態(tài)資源一般放在CDN上緩存時(shí)間設(shè)置的比較長(zhǎng),比如1個(gè)月。這樣假設(shè)發(fā)布的版本有問題,需要清理CDN緩存,并且也需要清理瀏覽器緩存,而且因?yàn)榇嬖诎姹靖采w的問題,即使覆蓋了也不一定保證是操作正確了。

● 發(fā)布新的靜態(tài)資源到源服務(wù)器。

● 清理CDN緩存,從而可以回源取到***的靜態(tài)資源。

● 在新的URL上添加隨機(jī)數(shù)清理瀏覽器緩存,如

  1. <script type="text/javascript"src="/js/index.js?time=201610231111"></ script>。 

當(dāng)當(dāng)前發(fā)布版本出現(xiàn)問題時(shí),只需要將版本號(hào)更改為上一個(gè)版本即可,不需要清理CDN、不需要清理瀏覽器緩存。

當(dāng)然,這里要設(shè)置合理的服務(wù)端頁面緩存時(shí)間,比如2分鐘,用戶看到發(fā)布錯(cuò)誤的版本最多2分鐘時(shí)間。為了方便測(cè)試,可以在請(qǐng)求參數(shù)中加入版本號(hào),如http://item.jd.com/2381431.html?version=1.0.15,方便驗(yàn)證老版本或者測(cè)試新版本,使得測(cè)試或驗(yàn)證多個(gè)版本時(shí),不需要來回修改服務(wù)端代碼。

【本文是51CTO專欄作者張開濤的原創(chuàng)文章,作者微信公眾號(hào):開濤的博客( kaitao-1234567)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-07-02 16:50:21

2017-06-16 15:16:15

2017-05-10 11:40:29

緩存Nginx HTTP

2017-05-01 17:03:01

Java緩存分布式

2017-04-18 14:49:38

應(yīng)用層API代碼

2017-06-04 16:24:27

線程線程池中斷

2017-04-21 08:51:42

API緩存分布式

2017-05-05 10:13:03

應(yīng)用級(jí)緩存緩存代碼

2012-12-13 17:38:48

2012年度IT博客大IT博客大賽博客

2020-10-16 18:41:43

command設(shè)計(jì)模式代碼

2009-11-16 17:15:12

Oracle減少回滾段

2009-11-16 13:41:18

Oracle分離回滾段

2009-07-20 18:11:52

iBATIS事務(wù)Spring

2010-04-16 17:31:22

ORACLE回滾段

2012-12-26 09:36:45

MySQLDelete

2011-07-29 16:21:21

Oracle數(shù)據(jù)庫(kù)回滾段

2023-11-04 21:31:42

微軟Windows

2024-07-16 08:38:06

2021-09-06 18:55:57

MySQLCheckpoint機(jī)制

2009-07-08 15:01:00

Servlet Ses
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜精品网站 | 91天堂网| 欧美男人亚洲天堂 | 无码日韩精品一区二区免费 | 国产综合第一页 | 国产精品一区二区福利视频 | 91电影 | 国产成人av免费看 | 日韩综合网| 亚洲三区在线观看 | 精品国产一区二区国模嫣然 | 国产成人影院 | 三级在线免费 | 香蕉av免费 | 免费久草| 三级黄色网址 | 国产十日韩十欧美 | 国产免费看 | 毛片网站在线观看视频 | 久久性色| 欧美精品在线观看 | 国产欧美日韩视频 | 免费在线观看成人 | 亚洲午夜精品一区二区三区 | 精品国产一区二区 | 欧美日韩久久 | 91久久久久久久久久久 | 翔田千里一区二区 | 国产精品久久久99 | 天天干天天想 | 亚洲美女视频 | 精品久久久久久久久久久 | 四色永久| 久久极品 | 在线男人天堂 | 中文字幕一区二区三区精彩视频 | 国产一级片一区二区三区 | 久久国产激情视频 | www午夜视频 | 成人精品一区 | 午夜精品一区二区三区三上悠亚 |