乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      微服務(wù)架構(gòu)終極探討

       quasiceo 2016-06-08

      微服務(wù)架構(gòu)終極探討

      作者 James Kearney ,譯者 王慶 發(fā)布于 2016年6月8日 | 1 討論

      在上一篇博文微服務(wù)架構(gòu):Kafka的崛起中,我們討論了在Movio大家更熱衷于使用Kafka作為微服務(wù)間的通信組件。這篇文章將討論微服務(wù)間使用Kafka消息隊(duì)列通訊時(shí)一種如何校驗(yàn)數(shù)據(jù)的方法。

      存在的問(wèn)題

      我們吸納了大量來(lái)自外部的數(shù)據(jù)。為了適配特定的數(shù)據(jù)源,我們需要使用不同的通道拉/推這些數(shù)據(jù)。這些數(shù)據(jù)往往是相互關(guān)聯(lián)的,例如一個(gè)代表人的實(shí)體可能和他喜歡的電影產(chǎn)生聯(lián)系。由于外部輸入的數(shù)據(jù)不在我們的控制之內(nèi),所以不能肯定這些實(shí)體間的依賴關(guān)系是合法的。在這里合法性定義為我們的系統(tǒng)是否發(fā)送/接收到了和這些實(shí)體相關(guān)的電影數(shù)據(jù)。如果沒(méi)有相關(guān)的電影數(shù)據(jù),就不能肯定和這些實(shí)體相關(guān)聯(lián)的電影是否確實(shí)存在,從客戶端的角度看是一個(gè)數(shù)據(jù)一致性的問(wèn)題。每個(gè)想要使用這些數(shù)據(jù)的微服務(wù)都必須考慮到這些可能存在缺失依賴數(shù)據(jù)的問(wèn)題。

      概念

      如果我們能保證外部數(shù)據(jù)是一致的,就是說(shuō)所有的依賴數(shù)據(jù)都滿足呢?這是登臺(tái)微服務(wù)(staging microservice,即負(fù)責(zé)整個(gè)處理中某階段工作)的任務(wù)。這個(gè)登臺(tái)微服務(wù)會(huì)將“原始”(raw)實(shí)體數(shù)據(jù)流轉(zhuǎn)換成一個(gè)保證依賴關(guān)系數(shù)據(jù)也合法的數(shù)據(jù)流。原始在這里意味著不能保證它的依賴關(guān)系數(shù)據(jù)是合法的?,F(xiàn)在下游的微服務(wù)可以使用這個(gè)合法的數(shù)據(jù)流完成自己的任務(wù),不需要自己?jiǎn)为?dú)再對(duì)數(shù)據(jù)合法性做校驗(yàn)了。

      圖1. 每個(gè)微服務(wù)單獨(dú)做數(shù)據(jù)校驗(yàn)

      圖2. 一個(gè)單獨(dú)的微服務(wù)做數(shù)據(jù)校驗(yàn),其他的微服務(wù)會(huì)變得更輕并專注自己的工作

      在實(shí)際操作中登臺(tái)微服務(wù)的輸出流不可能做到和原始的輸入流是一模一樣的。當(dāng)遇到非法的“原始”的實(shí)體時(shí)怎么辦,例如它其中的一項(xiàng)依賴數(shù)據(jù)并不存在?你會(huì)一直阻塞整個(gè)數(shù)據(jù)流直到這個(gè)實(shí)體被校驗(yàn)成功?萬(wàn)一永遠(yuǎn)都不會(huì)收到這個(gè)依賴數(shù)據(jù)呢?
      要解決這個(gè)問(wèn)題,我們放寬了對(duì)輸出流的定義,并作出以下保證:

      1. 對(duì)于一個(gè)給定的實(shí)體,這個(gè)實(shí)體在輸出流中的順序?qū)⒑驮紨?shù)據(jù)流中的更新順序保持一致
      2. 原始數(shù)據(jù)流中合法的實(shí)體最終會(huì)被輸出到輸出流中
      3. 輸出流中的任意一個(gè)實(shí)體的依賴關(guān)系數(shù)據(jù)都是合法的

      注意第2點(diǎn),在我們收到一個(gè)無(wú)法驗(yàn)證是否合法的實(shí)體,這將允許我們先跳過(guò)這個(gè)問(wèn)題。我們保存原始的實(shí)體,未來(lái)進(jìn)行驗(yàn)證,從這個(gè)角度來(lái)說(shuō)我們認(rèn)為這個(gè)實(shí)體是“暫時(shí)的”(staged)。一旦這個(gè)實(shí)體合法我們就可以將對(duì)它的操作按照順序輸出到輸出隊(duì)列中。

      實(shí)現(xiàn)

      首先,我們需要了解登臺(tái)微服務(wù)的輸入流的特點(diǎn)。很明顯的一點(diǎn)就是為了校驗(yàn)原始數(shù)據(jù)流中的實(shí)體的合法性,我們需要更多的信息。為了進(jìn)行合法性校驗(yàn),該服務(wù)必須能夠檢查其任意一項(xiàng)依賴關(guān)系數(shù)據(jù)是否存在。以我們最喜歡的電影為例,這個(gè)登臺(tái)微服務(wù)必須能夠檢查這個(gè)實(shí)體指向電影的成員變量是否合法(使用Movio系統(tǒng))。

      在檢查那些依賴數(shù)據(jù)實(shí)體是否存在時(shí),我們可以用同步請(qǐng)求的方法連接到另外一個(gè)微服務(wù)。如果你讀了我們的Kafka博客文章,你會(huì)看到我們盡量避免這種直接耦合服務(wù)的情況。事實(shí)上,有一個(gè)更簡(jiǎn)潔的解決方案。假設(shè)我們有一個(gè)數(shù)據(jù)流,它的每項(xiàng)依賴數(shù)據(jù)都是合法的,如果我們的登臺(tái)微服務(wù)將這些數(shù)據(jù)流作為輸入,它將能在本地構(gòu)建起依賴數(shù)據(jù)的緩存?,F(xiàn)在登臺(tái)微服務(wù)可以在本地檢查實(shí)體的依賴數(shù)據(jù)是否合法,而不用再去請(qǐng)求另一個(gè)服務(wù)了。我們的登臺(tái)微服務(wù)生成了合法的數(shù)據(jù)流。那些沒(méi)有依賴數(shù)據(jù)的實(shí)體數(shù)據(jù)流直接就當(dāng)作合法的數(shù)據(jù)流,也不再需要登臺(tái)微服務(wù)了。

      注意:對(duì)于一種簡(jiǎn)單的外鍵類型聯(lián)系的數(shù)據(jù),我們只需要在我們的緩存中存儲(chǔ)標(biāo)識(shí)ID,使得存儲(chǔ)開銷非常小。反過(guò)來(lái),我們的微服務(wù)也能更好的解耦并且校驗(yàn)的速度也會(huì)大大提高。

      所以我們有兩套數(shù)據(jù)流輸入到登臺(tái)微服務(wù):輸入的原始數(shù)據(jù)流和合法的依賴數(shù)據(jù)流,并用2種算法來(lái)處理這些:

      原始數(shù)據(jù)流:

      1. 讀取外部數(shù)據(jù),接收原始實(shí)體
      2. 檢查本地緩存,看看它所有依賴數(shù)據(jù)是否命中緩存
        1.如果命中緩存,把這個(gè)實(shí)體發(fā)送到輸出隊(duì)列中
        2.如果沒(méi)有,保存這個(gè)臨時(shí)實(shí)體

      依賴數(shù)據(jù)流:

      1. 讀取依賴
      2. 保存到本地緩存中
      3. 如果依賴不在緩存中,登臺(tái)微服務(wù)中依賴它每個(gè)實(shí)體重新觸發(fā)一次檢查操作

      圖3:更詳細(xì)的登臺(tái)微服務(wù)架構(gòu)

      優(yōu)點(diǎn)

      登臺(tái)微服務(wù)將所有依賴數(shù)據(jù)校驗(yàn)邏輯放到一個(gè)地方。有幾個(gè)優(yōu)點(diǎn),這有點(diǎn)類似于把重復(fù)的邏輯轉(zhuǎn)換成一個(gè)函數(shù),而不是復(fù)制/粘貼代碼。

      最明顯的是,所有需要使用外部數(shù)據(jù)的微服務(wù),不需要自己再做重復(fù)校驗(yàn)工作了。登臺(tái)微服務(wù)可以保證校驗(yàn)方法的唯一性,同時(shí)簡(jiǎn)化了下游微服務(wù),使它們能夠?qū)W⒂谒鼈兊倪壿嫛?/p>

      登臺(tái)微服務(wù)有一個(gè)單獨(dú)的職責(zé)-保證依賴數(shù)據(jù)的有效性。因?yàn)榈桥_(tái)微服務(wù)功能比較簡(jiǎn)單,所以代碼也很簡(jiǎn)單,從而查找和修復(fù)錯(cuò)誤變得非常容易。

      根據(jù)這一點(diǎn),監(jiān)控登臺(tái)微服務(wù)的狀態(tài)并在異常狀態(tài)下發(fā)出告警變得非常容易。我們可以跟蹤實(shí)體花費(fèi)在登臺(tái)微服務(wù)上的時(shí)間,以及校驗(yàn)失敗的原因,比如說(shuō)哪個(gè)依賴數(shù)據(jù)缺失。這使得更容易追蹤所有存在的一致性問(wèn)題的外部數(shù)據(jù)。

      你可能已經(jīng)注意到了這里的主題;我認(rèn)為這種方法的主要優(yōu)點(diǎn)是簡(jiǎn)化我們的服務(wù),更容易來(lái)思考它們。最后的福利,我覺(jué)得這對(duì)我們有很大的幫助,微服務(wù)的可伸縮性和性能。性能優(yōu)化和并發(fā)性是很難解決的問(wèn)題,所以對(duì)你來(lái)說(shuō)邏輯越簡(jiǎn)單代碼就越不可能犯錯(cuò)誤,你才能在優(yōu)化/并行解決方案上投入更多。在處理大量數(shù)據(jù)的時(shí)候,優(yōu)化/并行處理是非常重要的。我們可以而且實(shí)際上已經(jīng)做到了,在登臺(tái)微服務(wù)上能夠做到在一個(gè)單一的實(shí)體ID的粒度上進(jìn)行縮放。

      實(shí)踐

      我們目前實(shí)際上在實(shí)現(xiàn)登臺(tái)微服務(wù)時(shí),數(shù)據(jù)流使用Kafka傳輸,Akka Actors處理并用Elasticsearch用來(lái)做本地存儲(chǔ)/緩存。我們不要過(guò)于依賴Akka或Elasticsearch,這樣我們就可以很容易地替換他們。我們使用的Kafka對(duì)整個(gè)微服務(wù)的擴(kuò)展性和容錯(cuò)能力是至關(guān)重要的。通過(guò)Kafka主題分區(qū)實(shí)現(xiàn)的擴(kuò)展性幾乎是透明的。錯(cuò)誤恢復(fù)簡(jiǎn)單到只需要設(shè)置一個(gè)分區(qū)的偏移。

      總結(jié)

      我們?cè)贛ovio研究如何使用Kafka和微服務(wù)架構(gòu)來(lái)接收、校驗(yàn)和處理外部數(shù)據(jù),希望這是一個(gè)有趣的過(guò)程。這種使用微服務(wù)確保數(shù)據(jù)流合法性的概念不僅僅限于相關(guān)依賴數(shù)據(jù)檢查,它同樣可以適用于數(shù)據(jù)變換或內(nèi)部校驗(yàn),例如一個(gè)字段不能超過(guò)一定的長(zhǎng)度。

      讓我來(lái)總結(jié)一些注意事項(xiàng)吧。使用微服務(wù)架構(gòu)往往看起來(lái)似乎是在你的解決方案某些層增加了一定的復(fù)雜性。我認(rèn)為微服務(wù)在基礎(chǔ)架構(gòu)中引入的這些復(fù)雜性是合理的;在我們的案例中有Kafka和Elasticsearch。其他的復(fù)雜性主要來(lái)自于處理并發(fā)以及如何在整個(gè)解決方案中更好的處理耦合問(wèn)題。如果你需要微服務(wù)提供的擴(kuò)展性,你將不得不處理這些并發(fā)的問(wèn)題(以及一些基礎(chǔ)架構(gòu)的工作)。但是,通過(guò)應(yīng)用通用的技術(shù),比如通過(guò)規(guī)范代碼(例如單一職責(zé)原則,DRY和代碼重用),也能以相同的方式降低整體系統(tǒng)的復(fù)雜性,并獲得類似的收益。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多