從實習到如今,一直在作Unity相關的業務,不知不覺中感受已經不在關注服務器相關的技術了。一次偶然的機會再騰訊的gad平臺上觀看了雲風在15年在騰訊作的skynet講座(http://gad.qq.com/content/coursedetail/467),skynet是用c寫的核心,lua作上層業務,基於actor模型的服務器框架,哈哈,此次學習actor模式的學習也是所以而起。html
Actor模型爲並行而生,簡單說是未解決高併發的一種編程思路。在Actor模型中,主角是Actor,相似一種worker,Actor彼此之間直接發送消息,不須要通過什麼中介,消息是異步發送和處理的。在Actor模式中,「一切皆是Actor」,全部邏輯或者模塊均別看作Actor,經過不一樣Actor之間的消息傳遞實現模塊之間的通訊和交互。Actor模型描述了一組爲了不併發編程的常見問題的公理:java
1.全部Actor狀態是Actor本地的,外部沒法訪問。
2.Actor必須只有經過消息傳遞進行通訊。
3.一個Actor能夠響應消息:推出新Actor,改變其內部狀態,或將消息發送到一個或多個其餘參與者。
4.Actor可能會堵塞本身,但Actor不該該堵塞它運行的線程。git
傳統的併發編程方式大都使用「鎖」的機制,相信大多數都是」悲觀鎖「,這裏幾乎能夠判定會出現兩個明顯的問題:github
1.隨着項目體量增大,業務越發複雜,不可避免大量使用「鎖」,然而你們都知道「鎖」的機制其實很耗性能的,因此大量使用鎖的機制確定會形成效率不高redis
2.即便大量依賴「鎖」解決了系統中資源競爭的狀況,可是因爲沒有一個規範的編程模式,最後系統的穩定性確定會出問題,最根本的緣由是沒把系統的任務調度抽象出來,因爲任務調度和業務邏輯的耦合在一塊兒,很難作一個很高層的抽象,保證任務調度有序。編程
3.難以維護等等弊端服務器
上面是傳統經過「鎖」的機制實現併發編程的缺點,然而Actor爲何必定層度上能夠解決這些問題呢?我的認爲其最根本的緣由是Actor模式下提供了一種可靠的任務調度系統,也就是在原生的線程或者協程級別上作了更高層次的封裝。這會給編程模式帶來巨大的好處:併發
1.因爲抽象了任務調度系統,那麼就可使系統的線程調度可控,易於統一處理,穩定性和可維護性好框架
2.做爲開發者咱們只須要關心每一個Actor的邏輯就能夠了,避免「鎖」的「濫用」異步
3.Actor也提供了不少基本準則,避免了不少併發編程中的問題
……
那麼Actor沒有缺點嗎?那也不是,好比當全部邏輯都跑在Actor中時,很難掌控Actor的粒度,稍有不慎就可能形成系統中Actor個數爆炸的狀況,Actor當出現必須共享數據或者狀態時就很難避免使用「鎖」,但彷佛因爲上面的「Actor可能會堵塞本身,但Actor不該該堵塞它運行的線程」準則衝突,哈哈,這個時候也許能夠選擇使用redis作數據共享
Actor技術如今仍是蠻成熟的,最著名的原生支持Actor併發模式的Erlang,還有內置Actor核心庫的Scala語言。
摘錄一下某網站的一段關於Scala的Actor模式代碼:
class Pong extends Actor { def act() { var pongCount = 0 while (true) { receive { case Ping => if (pongCount % 1000 == 0) Console.println("Pong: ping " + pongCount) sender ! Pong pongCount = pongCount + 1 case Stop => Console.println("Pong: stop") exit() } } } }
有些語言如java,C#並無原生對Actor模式的支持,可是有不少的開源庫彌補了這個缺失。如著名的Akka就提供了對java Actor模式的支持,Akka很是龐大,準確說它不只是對Actor模式的支持,更是提供了基於Actor編程框架,學習成本其實還蠻高的。推薦一個輕量級基於java的Actor庫μJavaActors,它僅僅只有1200行左右的代碼,實現了Actor核心,初學者能夠把代碼讀一遍,基本上Actor模式就有個入門了。最後還有一個基於C#的Actor開源項目Orleans,聽說被很多大型項目採用。
μJavaActors簡單對Actor有個初步理解,後面會記錄一下關於Akka和μJavaActors項目的Demo、源碼簡單分析,最後會用C#簡單實現一個Actor庫。下面附上文中提到的技術點的連接:
Orleans:https://github.com/dotnet/orleans
Akka:https://github.com/akka/akka
μJavaActors:http://www.ibm.com/developerworks/cn/java/j-javaactors/
Actor入門:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html