[料理佳餚] 概念性地了解一下 Akka.NET 和 Actor Model 以及響應式系統(Reactive System)

隨著業務的增長,應用程式要處理的需求愈來愈多,也愈來愈細,需求間的依賴關係也會變得複雜,當使用者也隨之增加的時候,應用程式也需要進行拆分及擴展,因此我們需要一種設計方法,來引導我們針對高併發、分布式、需求多又細又複雜的應用程式來進行設計。

Akka.NET 是實作 Actor Model 的其中一套框架,而 Actor Model 恰好可以用來實現響應式系統,有了概念,有了原則,也有了工具,這些就可以讓我們設計出高性能、高可用、可伸縮的應用程式。

響應式系統(Reactive System)

簡單來說,響應式系統就是用響應式方法開發的系統,這個有點廢話,依據響應式宣言(Reactive Manifesto)的說明,響應式系統有四個特性:

  1. 敏捷的回應(Responsive):在可能的情況之下,系統要及時回應。
  2. 有復原能力(Resilient):系統在出現失敗的時候,仍然保持敏捷的回應。
  3. 有伸縮能力(Elastic):系統在面對不斷變化的工作負載之下,仍然保持敏捷的回應。
  4. 消息驅動(Message Driven):系統依賴非同步的消息傳遞。

因此響應式系統會更加靈活、鬆耦合、可伸縮、容錯,具有更即時的反應能力。

Actor Model

Actor Model 在 1973 年就已被發表在論文上,只是當時硬體技術的限制,無法將這個理論完整地付諸實踐,現在就不一樣了,我們處於多核處理器、行動載具、雲服務的時代,硬體技術已經不可同日而語了。

Actor Model 以 Actor 為一個基本的運算單位,Actor 只是抽象上的概念,Actor 是以消息來驅動它執行運算,可以依需求選擇平行運算或是串接運算,Actor 與 Actor 之間是解耦的、隔離的,Actor 之間也是透過消息來溝通,以上的種種特性,拿來打造響應式系統是再適合不過的了。

Akka.NET

Akka.NET 是實作 Actor Model 的框架之一,讓 .NET 也可以撰寫 Actor Style 的應用程式,Actor 是基本的運算單位,眾多 Actor 會組成 Actor System,一個 Application 可以包含多個 Actor System,整個 Application、Actor System、Actor 的關係看起來就會像這樣:

Actor 執行運算都是非同步的,而且是分散式的,每個 Actor 還會受到監督,萬一 Actor 在執行運算的過程中發生失敗,監督機制就會發揮作用,以達到容錯的效果,除此之外,Actor 可以根據處理的消息量,自動增加或減少 Instance 的數量,讓應用程式的運算能力是可伸縮的,因此我們可以看得出來 Akka.NET 的目標,一開始就是設定在讓程式設計師設計出可容錯、可伸縮的應用程式。

補上自己的一點心得,Akka.NET 聽起來很神,在開始用它來開發程式之後,發現它神不是因為工具有多厲害(當然工具也很厲害),而是我們需要改變程式設計的思維,當思維轉變之後,就會發現 Akka.NET 已經把我們要的都準備好在那兒了,它已經為我們把路給舖好了,只要跟著走就行了。

參考資料