基於Golang的遊戲伺服器架構cellnet開發日記(二)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

看官們肯定還有大部分不是很熟悉Actor模型. 我這裡基於Erlang, Skynet等語言和架構庫來實戰型解釋下Actor模型.  Actor概念

Actor模型和OO類似, 都是符合人的思維模式進行編碼. OO裡啥都是類, 用類來類比對象, 解決所有的問題. Actor類似的使用Actor來類比處理對象和單元 

Actor在Erlang中叫進程(非作業系統進程), 在Skynet中叫svc(服務)  Mailbox訊息佇列

每個Actor中包含有一個mailbox, 也就是郵箱. Actor自己只能通過收發mailbox與外界進行溝通, 也就是說, Actor之間只能通過訊息進行互相交流, 不能採用其他形式. 

mailbox本身是一個順序隊列, 先進先出. 而且mailbox從理論上說沒有上限, 實際上呢, mailbox可能會由於不斷的訊息堆積導致記憶體上漲. 這都是正常的. 

既然mailbox是隊列, 也就代表著一個Actor裡的邏輯處理是順序的, 單線程的. 但Actor群體中每個Actor可以獨立處理事務. 因此CPU可以分到每個Actor中進行處理,並發的大業也就奠定了基礎.  Actor的標識: ID

那麼, Actor之間的訊息要派發, 怎麼定位Actor呢? 使用指標?控制代碼? 都不是的. 

Actor定位使用用ID. 每個Actor有全域唯一的ID, 這裡不使用GUID, 因為太難定位了, Erlang選擇了一種優雅的方式實現ID. 先吃一個栗子: 

0.11   1.2   3.5 

這就是Erlang的pid(進程id). 點前面的部分代表的是某個獨立域, 在這個域中通過序號標示每個進程的id,序號就是小數點後面的部分 

那麼, 有了ID, 派發訊息就變的很簡單了, 看栗子 

send( 來源id,  目標id, 發送內容) 

有來源id的存在, 是為了回傳, 或者虛擬來源.  通訊自由與部署無關性

有了Actor模型的存在, 邏輯都是分布式編寫, 意思就是掛在每個Actor上來編寫. 而由於Actor模型之間只有訊息通訊, 沒有函數調用, 指標之類的本地內容. 因此讓Actor的部署變的非常自由. 也就是說, Actor的邏輯, 無需關心自己被部署在1個進程, 還是幾台機器. 但是為了內部效能和傳輸效率的考慮. 能不拆進程, 盡量在同一個進程處理, 能不拆到多台機器, 盡量減少拆到多台機器. 

但當你確實需要並發時, 只需要輕鬆的修改下設定或者少量代碼, 整個邏輯就可以跑在分布式叢集中了

同步和非同步

按照Erlang的處理方式, 預設進程(Actor)間使用send發送訊息, 這個過程是非同步非阻塞的;  當需要同步處理時, 會使用rpc, 也就是使用call的方式進行同步等待, 等對方進程(Actor)收到並處理訊息後, 返回結果後, call的調用才結束.

如果call處理中, 其他的Actor給你發訊息時, 訊息會一直儲存在你的Actor的mailbox中, 這裡認為mailbox無限大

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.