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