開源并發框架,Skynet 1.0.0 RC 版發布
拖了很久,終于決定給 skynet 1.0.0 封版了。比預期的時間 足足晚了半年,好在還是在 2015 年把這個事情啟動了。
其實已經很久沒有對已有特性做修改了,如果的項目是在今年 3 月份以后跟進的 1.0 alpha 版的話,升級到目前的最新版本應該不會有太大痛苦。最近幾個月幾乎沒有增加新的特性,反而是在裁減一些多余的,用的人不多的東西(為了兼容,把這樣一些 API 移到了一些獨立的模塊中,方便廢棄)。
據我所知,skynet 用于的商業游戲項目(以及一些非游戲項目)早已經超過了 2 位數,收獲了不錯的口碑。它不再是我們自己公司的內部項目,持續收到不同人的 PR 說明很多同學不僅僅在使用,更是用心在 review 代碼,讓它真正成為一組公眾視野下的代碼。我相信這是開源的終極意義:眾目睽睽之下, Bug 無所遁形。
我們自己的項目也從 skynet 開源經營中獲益良多。有好幾處來源于外部的 bugfix 都是在錯誤發生前被堵住,只是可惜的是,我們也有項目未能及時跟進,只到真的出錯了才回頭發現在主干上早已改過。這些事故反而證明了開源對于提高項目質量的作用。
這次發布 1.0.0 正式版本的候選版 (RC) ,并專門公告,就是希望有在使用 skynet 的同學,尤其是已經有項目上線運營的,能夠在最后這幾天將遺留問題提出來,issue 或 pr 都可以。不要把遺憾留到 1.0.1 :)
我希望這次把 RC 標簽保留一個月,在農歷新年前換成正式版。
對于因為 skynet 常年掛著 alpha (其實 beta 已經一個月了)標簽還在猶豫的同學,希望換上正式版標簽后可以打消你的疑慮(當然,我個人并不覺得標簽換了后,代碼質量會有本質變化)。
同時不要再不斷的問 “真的有項目用 skynet 的嗎?”,“skynet 有文檔嗎?”。
尤其對于后一個問題,我對連 README 都不看的同學,真的很煩回答啊。
skynet 不僅有 FAQ ,也有中文的文檔,而且文檔更新的還很及時。麻煩你讀一下 readme 以及跟著鏈接去看看 wiki 吧,能問出 skynet 有文檔嗎這種問題的同學,我相信把文檔擺在他面前也是讀不下去的,文檔對他就沒有存在意義。
算起來從 2012 年 8 月開源發布(7 月開始寫第一行代碼)到現在居然已經有 3 年有余。這么一個小小的項目經歷了三年,整個過程都有線上運營的項目在緊跟。為了歷史兼容問題,必然有無數遺憾。傳言 linus 說過,所有項目你都要做兩次才明白到底怎么做。
我不知道有沒有機會重新來做 skynet 2.0 (目前沒有任何這方面的計劃),把我認為錯誤的設計,更好的設計推倒重來一次。至少可以把項目的代碼風格統一一點,看起來更漂亮。
但眼下要做的事情僅僅只是:趕緊發布第一個穩定版,讓更多的人放心來用。用的人越多,后來人也就越放心。
Skynet 是一個基于 Actor 模式的開源并發框架。
skynet 節點,通過 master ,認識網絡中所有其它 skynet 節點。它們相互一一建立單向通訊通道。也就是說,如果一共有 100 個 skynet 節點,在它們啟動完畢后,會建立起 1 萬條通訊通道。
這個系統是單進程多線程模型。
每個內部服務的實現,放在獨立的動態庫中。由動態庫導出的三個接口 create init release 來創建出服務的實例。init 可以傳遞字符串參數來初始化實例。比如用 lua 實現的服務(這里叫 snlua ),可以在初始化時傳遞啟動代碼的 lua 文件名。
每個服務都是嚴格的被動的消息驅動的,以一個統一的 callback 函數的形式交給框架。框架從消息隊列里取到消息,調度出接收的服務模塊,找到 callback 函數入口,調用它。服務本身在沒有被調度時,是不占用任何 CPU 的。框架做兩個必要的保證。
一、一個服務的 callback 函數永遠不會被并發。
二、一個服務向兩一個服務發送的消息的次序是嚴格保證的。
我用多線程模型來實現它。底層有一個線程消息隊列,消息由三部分構成:源地址、目的地址、以及數據塊。框架啟動固定的多條線程,每條工作線程不斷的 從消息隊列取到消息。根據目的地址獲得服務對象。當服務正在工作(被鎖住)就把消息放到服務自己的私有隊列中。否則調用服務的 callback 函數。當 callback 函數運行完后,檢查私有隊列,并處理完再解鎖。
線程數應該略大于系統的 CPU 核數,以防止系統饑餓。(只要服務不直接給自己不斷發新的消息,就不會有服務被餓死)
由于我們是在同一個進程內工作的。所以我對消息傳遞做了一點優化。對于目前的點對點消息,要求發送者調用 malloc 分配出消息攜帶數據用到的內存;由接受方處理完后調用 free 清理(由框架來做)。這樣數據傳遞就不需要有額外的拷貝了。
來自: http://www.oschina.net/news/69442/skynet-1-0-0-rc