Actor模式初步入門


     從實習到現在,一直在做Unity相關的業務,不知不覺中感覺已經不在關注服務器相關的技術了。一次偶然的機會再騰訊的gad平台上觀看了雲風在15年在騰訊做的skynet講座(http://gad.qq.com/content/coursedetail/467),skynet是用c寫的核心,lua做上層業務,基於actor模型的服務器框架,哈哈,這次學習actor模式的學習也是因此而起。

Actor模型概念

     Actor模型為並行而生,簡單說是未解決高並發的一種編程思路。在Actor模型中,主角是Actor,類似一種worker,Actor彼此之間直接發送消息,不需要經過什么中介,消息是異步發送和處理的。在Actor模式中,“一切皆是Actor”,所有邏輯或者模塊均別看做Actor,通過不同Actor之間的消息傳遞實現模塊之間的通信和交互。Actor模型描述了一組為了避免並發編程的常見問題的公理:

1.所有Actor狀態是Actor本地的,外部無法訪問。
2.Actor必須只有通過消息傳遞進行通信。
3.一個Actor可以響應消息:推出新Actor,改變其內部狀態,或將消息發送到一個或多個其他參與者。
4.Actor可能會堵塞自己,但Actor不應該堵塞它運行的線程。

 

    

Actor優點、缺點分析

     傳統的並發編程方式大都使用“鎖”的機制,相信大多數都是”悲觀鎖“,這里幾乎可以斷定會出現兩個明顯的問題:

    1.隨着項目體量增大,業務愈加復雜,不可避免大量使用“鎖”,然而大家都知道“鎖”的機制其實很耗性能的,所以大量使用鎖的機制肯定會造成效率不高

    2.即使大量依賴“鎖”解決了系統中資源競爭的情況,但是由於沒有一個規范的編程模式,最后系統的穩定性肯定會出問題,最根本的原因是沒把系統的任務調度抽象出來,由於任務調度和業務邏輯的耦合在一起,很難做一個很高層的抽象,保證任務調度有序。

    3.難以維護等等弊端

    上面是傳統通過“鎖”的機制實現並發編程的缺點,然而Actor為什么一定層度上可以解決這些問題呢?個人認為其最根本的原因是Actor模式下提供了一種可靠的任務調度系統,也就是在原生的線程或者協程級別上做了更高層次的封裝。這會給編程模式帶來巨大的好處:

    1.由於抽象了任務調度系統,那么就可以使系統的線程調度可控,易於統一處理,穩定性和可維護性好

    2.作為開發者我們只需要關心每個Actor的邏輯就可以了,避免“鎖”的“濫用”

    3.Actor也提供了很多基本准則,避免了很多並發編程中的問題 

    ……

那么Actor沒有缺點嗎?那也不是,比如當所有邏輯都跑在Actor中時,很難掌控Actor的粒度,稍有不慎就可能造成系統中Actor個數爆炸的情況,Actor當出現必須共享數據或者狀態時就很難避免使用“鎖”,但似乎由於上面的“Actor可能會堵塞自己,但Actor不應該堵塞它運行的線程”准則沖突,哈哈,這個時候也許可以選擇使用redis做數據共享

 

Actor技術推薦

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM