Akka框架
1. 重要概念
2. Actor模型
3. Akka架構簡介
多核處理器的出現使并發編程(Concurrent Programming)成為開發人員必備的一項技能,許多現代編程語言都致力于解決并發編程問題。并發編程雖然能夠提高程序的性能,但傳統并發編程的共享內存通信機制對開發人員的編程技能要求很高,需要開發人員通過自身的專業編程技能去避免死鎖、互斥等待及競爭條件(Race Condition)等,熟悉Java語言并發編程的讀者們對這些問題的理解會比較深刻,這些問題使得并發編程比順序編程要困難得多。
Scala語言并沒有直接使用Java語言提供的并發編程庫,而是通過Actor模型來解決Java并發編程中遇到的各種問題,為并發編程提供了更高級的抽象。
1 重要概念
(1)并發和并行
并發和并行從宏觀來看,都是為進行多任務運行,但并發(Concurrency)和并行(parallelism)兩者之間是有區別的。并行是指兩個或者兩個以上任務在同一時刻同時運行,;而并發是指兩個或兩個以上的任務在同一時間段內運行,即一個時間段中有幾個任務都處于已啟動運行到運行完畢之間,這若干任務在同一CPU上運行但任一個時刻點上只有一個任務運行。圖121給出了多核處理器下的現代操作系統進程和線程模型,圖中進程2的線程1被調用度到處理器的核2上運行、進程3的線程1被調度到處理器的核3上運行,進程2的線程1和進程3的線程1是并行的,它們可以同時運行,而進程1的線程1和線程2都調度到處理器的核1上運行,此外它們還共享線程1的內存空間,在運行時面臨著資源競爭包括CPU、內存及其它如IO等,它們在同一時候只能運行一個,但在一段時間內都可以運行,因此進程1的線程1和線程2是并發執行的。
圖1 進程、線程模型
(2)橫向擴展和縱向擴展
所謂縱向擴展(Scale Up)指的是增加程序的進度或線程數量,提高程序的并發性;而橫向擴展(Scale Out)指的是程序可以擴展到其它機器上運行,即通過分布式系統來提到程序的并行度。傳統的Java并發編程模型不容易進行縱向擴展,因此并發的線程數越多,程序行為便會變得很難理解和控制,更多的線程加入到資源競爭,出現死鎖等情況的概率增加。橫向擴展比縱向擴展困難更大,此時的程序變為分布式環境下的應用,情況更為復雜,對開發人員的要求更高。Scala提供的Actor模型可以解決并發應用程序的橫向擴展和縱向擴展問題,如圖2、圖3給出了基本Actor模型的橫向擴展和縱向擴展。
圖2 縱向擴展
圖3 橫向擴展
2 Actor模型
在使用Java語言進行并發編程時,需要特別關注共享的數據結構,線程間的資源競爭容易導致死鎖等問題,而Actor模型便是要解決線程和鎖帶來的問題,Actor是一種基于事件(Event-Based)的輕量級線程,在使用Actor進行并發編程時只需要關注代碼結構,而不需要過分關注數據結構,因此Actor最大限度地減少了數據的共享。 Actor由三個重要部分組成,它們是狀態(state),行為(Behavior)和郵箱(Mailbox),Actor與Actor之間的交互通過消息發送來完成,Actor模型如圖4所示,狀態指的是Actor對象的變量信息,它可以是Actor對象中的局部變量、占用的機器資源等,狀態只會根據Actor接受的消息而改變,從而避免并發環境下的死鎖等問題;行為指的是Actor的計算行為邏輯,它通過處理Actor接收的消息而改變Actor狀態;郵箱(mailbox)建立起Actor間的連接,即Actor發送消息后,另外一個Actor將接收的消息放入到郵箱中待后期處理,郵箱的內部實現是通過隊列來實現的,隊列可以是有界的(Bounded)也可以是無界的(Unbounded),有界隊列實現的郵箱容量固定,無界隊列實現的郵箱容易不受限制。
圖4 Actor模型
不難看出,Actor模型是對現實世界的高度抽象,它具有如下特點:(1)Actor之間使用消息傳遞機制進行通信,傳遞的消息使用的是不可變消息,Actor之間并不共享數據結構,如果有數據共享則通過消息發送的方式進行;(2) 各Actor都有對應的mailbox,如果其它Actor向該Actor發送消息,消息將入隊待后期處理;(3)Actor間的消息傳遞通過異步的方式進行,即消息的發送者發送完消息后不必等待回應便可以返回繼承處理其它任務。
3 Akka并發編程框架
Scala語言中原生地支持Actor模型,只不過功能還不夠強大,從Scala 2.10版本之后,Akka框架成為Scala包的一部分,可以在程序中直接使用。Akka框架作為Akka是一個以Actor模型為基礎構建的基于事件的并發編程框架,底層使用Scala語言實現,提供Java和Scala兩種API,它屬于LightBend公司(原Typesafe公司)體系結構的一部分,如圖5所示。
圖5 Lightbend 體系結構[ ]
Akka框架意在簡化高并發、可擴展及分布式應用程序的設計,它具有如下優勢:
(1) 使用Akka框架編寫的應用程序既可以橫向擴展(Scale Out)、也可縱向擴展(Scale Up)。
(2) 編寫并發應用程序更簡單,Akka提供了更高的抽象,開發人員只需要專注于業務邏輯,而無需像Java語言那樣需要處理底級語義如線程、鎖及非阻塞IO等。
(3) 高容錯,Akka使用“let it crashes”機制,當Actor出錯時可以快速恢復。
(4) 事件驅動的架構,Akka中的Actor之間的通信采用異步消息發送,能夠完美支持事件驅動。
(5) 位置透明,無論是Actor運行在本地機器還是遠程機器上,對于用戶來說都是透明的,這極大地簡化了多核處理器和分布式系統上的應用程序編程。
(6) 事務支持能力,支持軟件事務內存(software transactional memory,STM),使Actor具有原子消息流的操作能力。
Akka框架由下列十個組件構成:
(1) akka-actor :包括經典的Actor、Typed Actors、IO Actor等
(2) akka-remote:遠程Actor
(3) akka-testkit:測試Actor系統的工具箱
(4) akka-kernel :Akka微內核,用于運行精簡的微型應用程序服務器,無需運行于Java應用服務器上。
(5) akka-transactor :Transactors 即支持事務的 actors,集成了Scala STM
(6) akka-agent – 代理, 同樣集成了Scala STM
(7) akka-camel – 集成Apache Camel
(8) akka-zeromq – 集成ZeroMQ 消息隊列
(9) akka-slf4j – 支持SLF4J 日志功能
(10) akka-filebased-mailbox – 支持基于文件的mailbox
————————————————
原文鏈接:https://blog.csdn.net/lovehuangjiaju/article/details/51039985
總結
- 上一篇: 分布式应用框架Akka快速入门
- 下一篇: 高可用系统架构设计 技术方案