<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          服務(wù)優(yōu)雅下線,沒你想的那么簡單?

          共 2012字,需瀏覽 5分鐘

           ·

          2022-01-14 22:10

          點(diǎn)擊上方藍(lán)字“設(shè)為星標(biāo)”



          大家好,我是架構(gòu)擺渡人。這是實(shí)踐經(jīng)驗(yàn)系列的第八篇文章,這個(gè)系列會(huì)給大家分享很多在實(shí)際工作中有用的經(jīng)驗(yàn),如果有收獲,還請(qǐng)分享給更多的朋友。

          ?

          服務(wù)部署,是一個(gè)避免不了的問題。按正常迭代的速度一般兩周會(huì)發(fā)一個(gè)版本,此時(shí)就需要部署新的代碼。發(fā)布方式,我相信主流的都是用滾動(dòng)發(fā)布,因?yàn)檫@樣的成本是最低的,機(jī)器數(shù)量是固定的,一臺(tái)臺(tái)機(jī)器輪流發(fā)布。

          ?

          但是我們總會(huì)在發(fā)布過程中碰到一些報(bào)錯(cuò)信息,那是因?yàn)檎?qǐng)求還沒結(jié)束,某些組件已經(jīng)強(qiáng)制停止了,比如我們的數(shù)據(jù)源,比如異步任務(wù)還沒處理完。

          ?

          那么如何解決這個(gè)問題呢?那就是服務(wù)優(yōu)雅下線,估計(jì)大家都聽過這個(gè)詞,但我不知道有多少做到了隨時(shí)發(fā)布都不影響功能的正常使用。



          優(yōu)雅下線涉及點(diǎn)



          ?




          外部請(qǐng)求必須處理完


          服務(wù)時(shí)時(shí)刻刻都在處理請(qǐng)求,一旦收到要停止的命令,那么必須等待當(dāng)前的請(qǐng)求執(zhí)行完畢才能去關(guān)閉一些資源,否則就會(huì)出現(xiàn)各種異常。

          ?

          除了等待,還需要讓外部的請(qǐng)求不要再過來,要告訴別人,我要下班了,不要來找我了,去找其他人吧。否則你永遠(yuǎn)都下不了班,是一樣的道理。

          ?




          異步任務(wù)必須處理完


          這里的異步任務(wù)通常指我們放入線程池中進(jìn)行處理的任務(wù),如果強(qiáng)制進(jìn)行程序的停止,那么線程池里的任務(wù)就會(huì)丟掉,所以除了同步被外部調(diào)用的邏輯要處理完,這種異步的邏輯也是要處理完的。

          ?

          這里再提一點(diǎn),就是如果異步任務(wù)丟失會(huì)對(duì)業(yè)務(wù)造成影響的這種場(chǎng)景,建議還是不要放到線程池里面進(jìn)行處理,如果要放,那么必須有持久化,程序重啟后可以繼續(xù)執(zhí)行。

          ?




          消息必須消費(fèi)完


          消息也是異步任務(wù)的一種類型,我們的目標(biāo)肯定也是需要讓消息消費(fèi)完才行。但是消息跟線程池里的任務(wù)最大的差別就在于:消息是有持久化的,并且有重試功能。

          ?

          就算消息沒消費(fèi)完,程序強(qiáng)制停止,這條消息沒有ACK,然后就會(huì)重試到另一臺(tái)機(jī)器的實(shí)例上繼續(xù)執(zhí)行,前提是你的這個(gè)執(zhí)行邏輯不能產(chǎn)生臟數(shù)據(jù),一定要通過事務(wù)保證數(shù)據(jù)的一致性。


          優(yōu)雅下線解決方案



          ?




          注銷服務(wù)實(shí)例


          下線最重要的一件事情就是注銷自己的實(shí)例,這樣才不會(huì)有后續(xù)的請(qǐng)求過來。注銷實(shí)例主要是跟注冊(cè)中心交互,將自己的實(shí)例從注冊(cè)中心下線掉就行了。下線后服務(wù)消費(fèi)者會(huì)重新從注冊(cè)中心拉取最新的實(shí)例列表,也就不會(huì)將請(qǐng)求路由過來。

          ?

          如果要下線的這個(gè)服務(wù)不是一個(gè)內(nèi)部服務(wù),而是網(wǎng)關(guān)呢?網(wǎng)關(guān)是流量的入口,客戶端的請(qǐng)求過來的,客戶端是自然不知道網(wǎng)關(guān)有多少實(shí)例,所以在網(wǎng)關(guān)前面都有一個(gè)負(fù)載均衡器,比如常用的Nginx。

          ?

          那就需要將這個(gè)下線的網(wǎng)關(guān)實(shí)例從Nginx中進(jìn)行下線操作,這樣后續(xù)的流量才不會(huì)被轉(zhuǎn)發(fā)過來,跟內(nèi)部服務(wù)是一樣的道理。

          ?

          Nginx如果有獨(dú)立的模塊去對(duì)接注冊(cè)中心的話,那么還是把注冊(cè)中心的給下線掉,Nginx就能感知到下線動(dòng)作。如果沒有對(duì)接,而是固定的配置信息,那么就需要改Nginx的配置,然后重新加載即可。

          ?




          注銷MQ消費(fèi)實(shí)例


          通過下線注冊(cè)中心里面的實(shí)例,外部流量就不會(huì)請(qǐng)求過來。此時(shí)還需要將MQ的實(shí)例進(jìn)行下線操作,告訴MQ的服務(wù)端,不要再給我推消息了或者是客戶端不再拉取消息。

          ?

          ?

          實(shí)現(xiàn)思路



          • 寫一個(gè)停止流量的接口,在接口中將本身實(shí)例從注冊(cè)中心,MQ進(jìn)行下線操作。

          • 寫一個(gè)檢測(cè)流量是否結(jié)束的接口,在接口中判斷當(dāng)前是否還有正在工作的線程,有沒有正在處理的消息,有沒有正在執(zhí)行的異步任務(wù)等等。

          • 當(dāng)完全沒有流量的時(shí)候,發(fā)布平臺(tái)直接對(duì)當(dāng)前進(jìn)程進(jìn)行kill操作,此時(shí)所有任務(wù)都已執(zhí)行完并且沒有新流量進(jìn)來,無損操作。

          • 執(zhí)行發(fā)布流程。


          ?

          這里其實(shí)涉及到一個(gè)點(diǎn),就是假如3分鐘了,還是有任務(wù)在處理,那么是否要強(qiáng)制中斷?

          ?

          這里其實(shí)可以這么做,就是我們的服務(wù)本身的實(shí)例一旦下線,正常的話幾秒鐘后就應(yīng)該沒有任務(wù)了,因?yàn)閷?duì)外的接口基本上都是毫秒級(jí)響應(yīng)。主要就怕異步任務(wù),比如線程池里堆積了好多任務(wù)等待執(zhí)行,所以大家需要去梳理下,如果有這種場(chǎng)景就調(diào)整,不要往線程池里堆積任務(wù),這樣才能保證在下流量的時(shí)候能夠盡快執(zhí)行完成。

          ?

          總結(jié)



          ?

          其實(shí)優(yōu)雅下線的核心在于流量的切換,就是我要下線的這個(gè)服務(wù)必須把所有外部的流量都切走,然后再把沒處理完的事情處理完,完成后就可以直接重新發(fā)布了。

          ?

          如果你們上了容器的話,容器管理平臺(tái)應(yīng)該是能夠提供優(yōu)雅下線的方式,像K8s里面應(yīng)該就有優(yōu)雅停止Pod的方式,不過我對(duì)K8s不太熟,記得是有的,其實(shí)原理也很簡單,先啟動(dòng)一個(gè)Pod,完成之后將流量切過去就行了,這種方式更簡單,充分利用了容器的優(yōu)勢(shì)。

          ?

          大家好,我是從古代穿越過來的美男子:架構(gòu)擺渡人。我將把我的武功秘籍全部傳授與你們,覺得有用請(qǐng)分享給身邊的朋友。來個(gè)三連吧,感謝各位!另外我還在B站錄制《真實(shí)訂單業(yè)務(wù),億級(jí)數(shù)據(jù)帶你實(shí)戰(zhàn)分庫分表》的實(shí)戰(zhàn)課程,記得去學(xué)習(xí)哦!

          ?

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品综合视频 | 亚洲手机在线 | av先锋资源在线 AV性爱在线观看 av在线无码高清 | 黑人大屌与欧美成人视频 | 亚洲免费毛片av 亚洲免费特级毛片 |