业务流程、长周期服务和微服务
在近期于倫敦Skills Matter舉行的DDD eXchange 2018會議上,Martin Schimak認為在最近幾年間,領域事件引發(fā)了越來越多的討論,但是我們對命令也應如此,在這次會議上他討論了微服務領域的事件、命令以及長周期的服務,以及流程管理器和類似的工具如何有助于運行核心的業(yè)務邏輯。
Schimak是奧地利的一名獨立咨詢顧問,他認為,事件最好的一點在于,它們代表了已經(jīng)發(fā)生過的事情。我們正在處理越來越多的分布式系統(tǒng),通過來自服務本身的保證能夠讓我們更加相信最終一致性。事件還有助于我們解耦服務,并且能夠回過頭去看過去發(fā)生了什么。
事件的優(yōu)勢是事件驅動架構越來越流行的原因之一,有時候,設計只依賴事件就能實現(xiàn)集成服務。有時這種簡化是合理的,但是Schimak指出,這也可能會帶來一些危險。以簡單訂單處理為例,在處理過程中,只包含order placed、payment received、goods fetched和goods shipped事件,它們會被支付、存儲和運輸服務所使用。一個簡單的變更,比如在跟客戶收費之前就將貨物提取出來,就會改變消息流,從而要求所有涉及到的服務都要進行變更,對于Schimak來說,服務之間的這種耦合是一個次優(yōu)的方案。
因為事件僅僅是已發(fā)生的事實,它們本身并不會觸發(fā)任何的操作。在監(jiān)聽事件的時候,我們需要一定形式的策略,該策略能夠決定當特定的事件接收到的時候,應該發(fā)生些什么。在純粹的基于事件的系統(tǒng)中,這種策略始終要位于事件消費服務之中。在基于命令的方式中,這個策略可以位于事件發(fā)布服務中,但是Schimak認為,有時候這兩個服務都不是合適的選擇。對他來講,第三種方案是新增一個中介者(mediator),它監(jiān)聽特定的事件并決定后續(xù)的步驟。
以上面的訂單服務為例,這個服務可能會監(jiān)聽相關的事件并發(fā)送命令,因此當客戶下單時協(xié)調流程并完成該訂單。在樣例中發(fā)生這樣的變化時,不僅訂單服務需要變更。Schimak指出,在這個過程中運行的邏輯通常是屬于業(yè)務核心領域中的邏輯。
對Schimak而言,命令是一些意圖,針對的是未來要發(fā)生的事情,他定義了命令執(zhí)行的兩種類型:
原子性事務執(zhí)行,一般的意圖是變更一個模型;例如,下單命令會創(chuàng)建一個訂單并發(fā)布下單事件;
復合的、長周期執(zhí)行,其意圖是更加業(yè)務級別的結果,可能需要多個步驟才能實現(xiàn)。樣例可以是相同的下單命令,但是這里的最終結果是完成訂單或取消訂單的事件。
在請求支付的場景中,我們應該努力實現(xiàn)有價值的業(yè)務結果。支付服務可能會發(fā)布payment received或payment cancelled事件。在Schimak的經(jīng)驗中,我們往往會采取相反的措施,暴露一些臨時的問題,比如信用卡收費失敗,并委托客戶端來對其進行處理。這意味著我們要強迫客戶端來處理策略方面的問題,而這些問題顯然是支付相關的——可能稍后進行重試,有可能使用新的信用卡數(shù)據(jù)。如果客戶端是訂單服務的話,那么它不僅要處理訂單,還要處理支付,這樣就將支付領域的知識擴展到了支付服務之外。這同時也會增加訂單服務的規(guī)模和復雜性。
將我們的問題委托給客戶端并強迫它們處理各種問題,那么它們就變成了上帝服務。
相反,我們應該將支付視為長周期的服務,它要處理支付相關的所有內部問題,并且只發(fā)布最終結果相關的事件,即payment received或payment cancelled。Schimak強調,這并不是要創(chuàng)建一個中心化的協(xié)調器(coordinator)來處理 整個業(yè)務,它指的是更好的API設計,保護不同的限界上下文。
在使用長周期服務時,一個通用的工具是Process Manager。流程管理的常見需求是處理時間和超時、重試以及流程失敗時的補償。我們可以自己實現(xiàn)所有這些功能,但Schimak更喜歡使用Axon消息和Saga管理或Lagom這樣的框架。他還建議使用某種形式的業(yè)務流程執(zhí)行引擎,但他強調工具必須是輕量級的,并且可以在單個服務中使用。開源的過程引擎框架包括Activiti、Camunda和Zeebee(也來自Camunda)。在serverless領域,AWS創(chuàng)建了Step Functions,其他云供應商也在朝著這個方向發(fā)展。
Schimak個人在長周期服務和業(yè)務處理引擎方面的經(jīng)驗包括多年在Zalando的訂單處理流程中使用Camunda。他和聯(lián)合來自Camunda的Bernd Rücker在InfoQ上撰寫了兩篇文章:事件、流程和長期運行的服務:工作流自動化的現(xiàn)代解決方案和洞悉流程!微服務與事件協(xié)同。
原文地址:http://www.infoq.com/cn/news/2018/07/events-commands-services
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的业务流程、长周期服务和微服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpClientFactory与St
- 下一篇: 构建可扩展的有状态服务