日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
張開(kāi)濤:回滾機(jī)制詳解

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

網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)建站專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營(yíng)網(wǎng)站定制開(kāi)發(fā).小程序定制開(kāi)發(fā),H5頁(yè)面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都汽車玻璃修復(fù)等企業(yè)提供專業(yè)服務(wù)。

一、事務(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ù),最常見(jiàn)的如兩階段提交、三階段提交協(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)一致性,我們只要能保證最終一致性即可,來(lái)看下結(jié)算下單序列圖。

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

二、代碼庫(kù)回滾

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

三、部署版本回滾

代碼測(cè)試完成后,接下來(lái)就要進(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ā)布修改過(guò)的類或文件),全量版本后回滾直接回滾即可,不會(huì)受到一些約束或限制。

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

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

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

比如頁(yè)面改版,添加新的功能此時(shí)需要灰度發(fā)布,一般情況下是兩個(gè)版本并行跑一段時(shí)間,一些用戶訪問(wèn)老版本,一些用戶訪問(wèn)新版本,功能驗(yàn)證成功后或者新版效果不錯(cuò)再全量發(fā)布。比如,我們可以通過(guò)類似于如下URL中帶有版本號(hào)來(lái)區(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ù),在一套集群部署即可,出問(wèn)題時(shí)要能非??焖俚厍袚Q回老版本。

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

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

一般前端應(yīng)用我們會(huì)采用Nginx作為接入層,通過(guò)AB方式慢慢將流量引入到新版本集群,比如1%、10%、50%、100%。如果新版本集群處理出現(xiàn)問(wè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;
  7. }

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

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

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

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

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

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

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

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

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

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

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

 
 
 
 
  1. <td id="c2yv6"></td>
  2. <td id="c2yv6"></td>

      <td id="c2yv6"></td>