監(jiān)控是一種明智的做法。系統(tǒng)會(huì)逐漸變得高度碎片化,為了對(duì)系統(tǒng)的運(yùn)行狀況獲得更全面的了解,人們對(duì)集中式監(jiān)控和日志會(huì)產(chǎn)生越來越高的需求。
Alex談到了在最新一期播客節(jié)目中所涉及的一個(gè)場(chǎng)景,這個(gè)場(chǎng)景中需要對(duì)有問題的版本進(jìn)行回滾,這就要確定相應(yīng)的微服務(wù),并確定進(jìn)行回滾可能會(huì)對(duì)其他服務(wù)產(chǎn)生的影響。他認(rèn)為:
結(jié)論1:如果你認(rèn)為對(duì)單層(Monolith)體系結(jié)構(gòu)進(jìn)行監(jiān)控已經(jīng)很困難,微服務(wù)的監(jiān)控要比這個(gè)難十倍,需要事先做好極為充分的規(guī)劃和更大的投入。
對(duì)于第二個(gè)問題,Alex談到了我們已經(jīng)從Sam Newman和Adrian Cockcroft等人處多次聽到的一種觀點(diǎn):
單層體系結(jié)構(gòu)的日志文件很可能已經(jīng)分散在不同位置,就算心里想著“單層”,但最終依然可能會(huì)使用多個(gè)不同技術(shù)層,并可能將日志保存在不同地方。微服務(wù)則會(huì)讓日志進(jìn)一步分散。現(xiàn)在如果需要調(diào)查有關(guān)某些用戶事務(wù)的場(chǎng)景,為了理解實(shí)際發(fā)生的一切,你可能需要從不同位置獲取所有服務(wù)的全部日志。
這就產(chǎn)生了他的下一個(gè)結(jié)論:
結(jié)論2:微服務(wù)的目標(biāo)就是將所有東西拆分為零散組件。但這種做法的副作用之一是運(yùn)維規(guī)程和監(jiān)控工作也需要分別應(yīng)用給每個(gè)服務(wù),進(jìn)而導(dǎo)致無法發(fā)揮“整體系統(tǒng)”的強(qiáng)大之處。通過恰當(dāng)?shù)墓ぞ咭越y(tǒng)一方式管理這一切已成為此時(shí)最大的挑戰(zhàn)。
第三個(gè)問題引述自Leslie Lamport對(duì)于分布式系統(tǒng)的定義中的一句話:“分布式系統(tǒng)是指某臺(tái)我從未聽說過的計(jì)算機(jī)也能導(dǎo)致我的程序崩潰的體系。”或者按照Alex的說法:“一個(gè)服務(wù)引發(fā)的問題,會(huì)造成其他地方出現(xiàn)連鎖反應(yīng)。”那么這個(gè)結(jié)論也就不言自明了:
結(jié)論3:對(duì)于單層體系,遇到問題后通常你會(huì)知道需要調(diào)查哪些方面,微服務(wù)使得人們難以確定問題根源以及要從哪里拿到所需數(shù)據(jù)。
在分布式系統(tǒng)中,“確定問題根源”這一需求進(jìn)一步產(chǎn)生了下個(gè)問題,此時(shí)日志可以提供一定的幫助,但日志只是解決方案的一部分:
大部分情況下,你寄希望于日志文件中獲得的前幾位變量數(shù)據(jù),但這些可能根本無法解決你的問題。這些信息只能讓你繼續(xù)追查下一條線索,進(jìn)而需要進(jìn)一步深入這樣的“魔法世界”,繼續(xù)運(yùn)行更多日志語句。隨后部署改動(dòng),期待著問題能夠重現(xiàn)或永不再現(xiàn),因?yàn)?hellip; 有時(shí)候僅僅添加一條日志語句似乎就能解決問題。這類似于墨菲法則的一次糟糕的大逆轉(zhuǎn)。
這也產(chǎn)生了我們的下一個(gè)結(jié)論:
結(jié)論4:如果微服務(wù)中一個(gè)問題的根源涉及到多個(gè)服務(wù),就很有必要使用一個(gè)集中的根源檢測(cè)工具。
Alex提到的最后一個(gè)問題是版本管理和服務(wù)之間的循環(huán)依賴。同時(shí)他也提到了在檢查依賴性時(shí)需要注意的兩個(gè)問題。
1,如果服務(wù)之間存在循環(huán)依賴,一旦某個(gè)事務(wù)卡在循環(huán)中,就很容易產(chǎn)生分布式堆棧溢出錯(cuò)誤。2,如果兩個(gè)服務(wù)共享同一個(gè)依賴項(xiàng),并且使用會(huì)影響到這些服務(wù)的方式更新了其他服務(wù)的API,那么就需要同時(shí)對(duì)這三個(gè)服務(wù)進(jìn)行更新。這就造成了另一種問題,例如:要先更新哪個(gè)服務(wù)?如何確保所有服務(wù)能順利地完成更新?
相互獨(dú)立的服務(wù)越多意味著可移植性越高,不同服務(wù)可以使用互不干涉的發(fā)布周期,但同時(shí)這樣做也會(huì)增加整個(gè)系統(tǒng)的復(fù)雜度,尤其是在可再生性(Reproducibility)方面。那么這就引出了我們的第五個(gè),也是最后一個(gè)結(jié)論:
結(jié)論5:在微服務(wù)體系結(jié)構(gòu)中,更容易產(chǎn)生依賴性問題所導(dǎo)致的錯(cuò)誤。
很高興看到在生產(chǎn)環(huán)境中運(yùn)用微服務(wù)的人就此展開的討論,更讓人高興的是,很多人已經(jīng)就其中的一些核心問題和解決這些問題的常見方法達(dá)成了一致。