事件驅(qū)動的微服務(wù)是一個未受到應(yīng)有探討的領(lǐng)域,在近日舉行的μCon倫敦2017微服務(wù)大會上,Greg Young表達(dá)了這樣的觀點。同時,他還特別強調(diào),不應(yīng)該對所有的微服務(wù)都使用事件驅(qū)動模式。相反,他建議逐個服務(wù)進(jìn)行考察,并將事件驅(qū)動模式運用到真正能從中受益的服務(wù)上。
Greg Young是一名事件驅(qū)動專家,同時也是Event Store的首席架構(gòu)師。他認(rèn)為,在創(chuàng)建微服務(wù)系統(tǒng)時需要考慮的一個重要的設(shè)計問題是,應(yīng)該每個微服務(wù)使用一個數(shù)據(jù)庫,還是所有的微服務(wù)都訪問同一個數(shù)據(jù)庫。在存儲狀態(tài)時,比如使用一個關(guān)系型數(shù)據(jù)庫,使用一個或多個數(shù)據(jù)庫并沒有很大的不同,但是,他指出,在使用“事件庫(event source)”時,多個服務(wù)使用一個事件庫比一個服務(wù)一個事件庫要簡單許多。原因是事件排序,他還提及了Leslie Lamport及他的論文“分布式系統(tǒng)中的時間、時鐘和事件順序”。
在每個服務(wù)一個事件庫的情況下,當(dāng)服務(wù)從兩個或兩個以上的事件庫中讀取事件時,既不能保證所有的事件被以和創(chuàng)建順序相同的順序讀取,也不能保證順序和事件重放時相同。在多個服務(wù)使用一個事件庫的情況下,順序就有保證了,因為順序是確定的。這就是“線性化(linearizing)”。該技術(shù)不能讓系統(tǒng)更具擴(kuò)展性,但卻可以讓系統(tǒng)更容易推斷,Young認(rèn)為,在大多數(shù)情況下,這都比將來可能出現(xiàn)的可擴(kuò)展性問題更重要。
Young指出,對于大多數(shù)系統(tǒng)而言,線性化都是有效的,即使是在每秒處理超過10K事件的時候。對于真正的高吞吐量,也許高達(dá)每秒250K事件,尋求另外一種設(shè)計也許就是好主意了。
由于操作會跨多個微服務(wù),所以相關(guān)性和因果關(guān)系標(biāo)識可以帶來極大的好處。當(dāng)一個服務(wù)引發(fā)了一個其他服務(wù)監(jiān)聽的事件,它們就會引發(fā)自己的事件,這會使系統(tǒng)產(chǎn)生一個難以追蹤的級聯(lián)事件流。但是,通過向事件添加三個標(biāo)識(uuid)——消息標(biāo)識、相關(guān)性標(biāo)識和因果關(guān)系標(biāo)識,就可以克服這個問題。
事件創(chuàng)建時會獲得唯一的消息標(biāo)識。把事件的相關(guān)性標(biāo)識設(shè)置為引發(fā)該事件的事件的相關(guān)性標(biāo)識,事件流中相關(guān)性標(biāo)識相同的所有事件都是有著相同的根源,把因果關(guān)系標(biāo)識設(shè)置為引發(fā)該事件的事件的消息標(biāo)識,就可以找出事件發(fā)生的順序。
在理解和查找錯誤出現(xiàn)的原因時,按照正確的順序查看整體消息流的能力非常有用。這項技術(shù)也可以用于非事件驅(qū)動的系統(tǒng)中。通過增加一個審計服務(wù),監(jiān)聽所有服務(wù)引發(fā)的所有事件并存儲它們,可以獲得同樣的可能性。
在演講中,Young還討論了其他主題,包括內(nèi)存服務(wù)、復(fù)制模型及地域分布。
按照計劃,明年的大會將于2018年11月5號到6號舉行。
查看英文原文:Designing Event Sourced Microservices