Akka 是一個用 Scala 編寫、面向 Java/Scala 的工具包與運行時,旨在簡化構建高併發、分布式、容錯、事件驅動應用的難度。其核心基於 Actor 模型,該模型由 Carl Hewitt 於 1973 年提出,旨在解決分布式編程中的共享狀態、鎖競爭、死鎖等難題。本文將帶你快速認知 Akka 的核心概念、Actor 特性及其在電信級系統中的驚人表現。
Actor 模型是一種計算模型,而非具體框架。其核心哲學:
「一切皆 Actor,Actor 之間僅通過異步消息傳遞通信,無共享狀態。」
| 特性 | 說明 |
|---|---|
| 系統中一切皆 Actor | 無中心控制器,每個 Actor 都是獨立計算單元 | Actor 完全獨立 | 無共享內存,狀態封裝在 Actor 內部,避免鎖競爭 |
| 消息處理並行 | 收到消息時採取的動作並行執行,單 Actor 內部按順序處理 |
| 標識與行為 | Actor 由郵箱地址(ActorRef)標識,行為由當前狀態與消息處理邏輯定義 |
| 原始 vs 非原始 Actor | 非原始 Actor 擁有郵箱地址、熟人集合(狀態)、行為定義 |
| 非阻塞異步消息 | 發送即返回,消息進入目標 Actor 郵箱(Mailbox)排隊 |
| 所有發送並行 | 消息發送不阻塞發送者,高吞吐低延遲 |
代碼持有的是 ActorRef(引用),而非 Actor 實例。這意味著:
fork-join-executor,高併發下表現優異。// 父 Actor 定義監督策略
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: ArithmeticException => Resume // 忽略異常,保留狀態繼續
case _: NullPointerException => Restart // 重新創建 Actor 實例,重置狀態
case _: IllegalArgumentException => Stop // 永久停止
case _: Exception => Escalate // 上報給父級
}
「讓它崩潰」哲學:業務邏輯只關注正常流程,異常交給監督層級處理,實現自我修復。
愛立信在電信交換系統中大規模使用 Akka(前身為 Erlang/OTP 體系思想),實現:
這得益於 Actor 模型的無共享、異步、監督重啟三大支柱,完美契合電信系統「永不停機」的極致要求。
| ✅ 適用 | ❌ 不適用 |
|---|---|
| 高併發狀態機(遊戲房間、聊天室、IoT 設備影子) | 單線程 CPU 密集型計算(如圖像處理、科學計算) |
| 事件溯源 / CQRS 架構 | 簡單 CRUD Web 應用(Spring MVC 足矣) |
| 分布式協調、集群單例、分片 | 強事務一致性場景(需配合 Akka Persistence + 事務外掛) |
| 流式處理、背壓控制 | 團隊無 Scala/Java 函數式基因,學習曲線陡峭 |
Akka 將 Actor 模型工程化,提供了位置透明、異步非阻塞、層級容錯的強大運行時。理解「一切皆 Actor、消息驅動、無共享狀態」這三句核心口訣,是通往響應式系統設計大門的鑰匙。對於追求高併發、高可用、可擴展的現代應用架構,Akka 是值得深度投入的利器。