微服務和反應式模型雖然很強大,但也帶來了不確定性。開發(fā)人員總是對消息驅(qū)動的系統(tǒng)持有疑問:
有人接收到我發(fā)出的消息了嗎?他們對消息做出回應了嗎?消息的順序會不會被打亂了?Vaughn Vernon在DDD探索大會的演講中提到,DDD是回答上述問題的基礎。使用通用語言(Ubiquitous Language)來描述由邊界上下文(Bounded Context)組成的系統(tǒng)可以降低分布式系統(tǒng)的復雜度。不確定性應該成為通用語言的一部分,比如邊界上下文之間的交互問題。
Vernon是“Implement Domain Driven Design”和“Reactive Messaging Patterns with the Actor Model”的作者,他認為為項目創(chuàng)建好上下文映射是至關重要的。從實際情況來看,業(yè)務的核心領域總會包含多個邊界上下文,而上下文映射體現(xiàn)了邊界上下文之間的關系。在建立上下文映射關系時,要專注在團隊之間的關系上,而不是去關注技術細節(jié),比如究竟是使用REST還是使用RPC。Vernon說,“集成對象比如何集成更加重要”。
Vernon看到了反應式系統(tǒng)的發(fā)展趨勢,反應式行為存在于微服務之中,同時又超越了微服務。這并非什么新概念,他說,Eric Evans早就在業(yè)界推廣事件模式。其核心思想就是對過去發(fā)生的事件作出反應,進而達到和諧的狀態(tài)。
微服務和反應式行為帶來了不確定性,包括事件順序的不確定性和事件的重復性問題。Vernon強調(diào)說,“就算你使用的是Kafka,認為自己是在按順序消費消息,但其實是在自欺欺人。如果任何一個消息可能出現(xiàn)亂序,那么所有消息都有可能出現(xiàn)亂序,你要為之做好應對準備”。
Vernon認為這種不確定性是很難得到消除的,因為我們已經(jīng)習慣于阻塞調(diào)用、數(shù)據(jù)庫鎖等事物,并總是期待事物是按照一定順序進行的。在反應式系統(tǒng)里,一些長久以來的信念開始土崩瓦解?;蛟S,開發(fā)者會本能地創(chuàng)建出門面(facade)來隱藏不確定性,寫出傳統(tǒng)的非反應式代碼,但Vernon認為我們應該要反其道而行之。
Vernon總結了自己處理不確定性的方式——“更少的查詢,更多的事件”。事件告訴我們在過去某個時刻發(fā)生了什么。我們不知道系統(tǒng)現(xiàn)在處于什么狀態(tài),只知道事件發(fā)生時的狀態(tài)以及在這一過程中發(fā)生了哪些變化。如何對這些事件作出反應式屬于業(yè)務決策,包括如何處理亂序問題。Vernon引用了Pat Helland的論文“Life Beyond Distributed Transactions”:“在一個不能依賴分布式事務的系統(tǒng)里,必須在業(yè)務層面管理不確定性”。
Vernon列舉了幾中不同形式的不確定性,并提供了用于管理不確定性的簡短代碼。他強調(diào)這些代碼只是業(yè)務決策的實現(xiàn)。業(yè)務必須擁抱不確定性,必須讓業(yè)務決策者來對其進行建模,而不是在軟件開發(fā)團隊內(nèi)部完成這件事情。不要通過創(chuàng)建門面來隱藏不確定性,而是盡你所能對不確定性進行建模。
查看英文原文:Vaughn Vernon Uses Reactive DDD to Model Uncertainty in Microservices