skynet框架 源碼分析 一

本人所看的skynet框架,是雲風所寫的開源分佈式服務器系統。
       說說廣泛流傳的分佈式系統,我覺得最簡單的理解就是,一個服務器系統可以開很多進程來完成任務,並且這些進程可以不受地域的限制,同時跑在不同的主機上面(當然也可以跑在同一臺主機上),以服務器集羣的方式應答各個服務請求,各進程之間通過socket的方式通信。

       我們先從整體結構上來俯視這個框架。
       大體上,該系統是一個actor模式的服務端框架。系統遵循的規則是:客戶端或者服務節點發送服務請求到服務系統,服務器系統專門開闢多個工作線程,從一個消息隊列中取一組消息,處理其中一個,然後歸還。也就是所謂的郵件列表形式,即在一個郵件列表中取一組郵件,該組郵件都來自同一個角色。取出該組郵件中的第一封,並處理其中服務請求。在完處理完畢之後,彈出該郵件,並且將郵件組重新放到郵件列表中,等待下一次處理。這樣做的目的,我猜測,作者的初衷應當是想構建一個無鎖的消息處理邏輯,達到即可以利用多線程,又可以簡化線程之間的臨界區域邏輯。
       接下來,假設我們只運行一個進程。那麼在進程啓動成功後,內部會生成有很多服務的節點,如圖所示:


      每個節點都有服務的功能,但是節點的服務類型可以重複比如:agent。同一個模塊,可以生成不同的服務節點,比如:snlua模塊(skynet node lua,框架中的節點並且在lua的中執行回調,後面會詳細解析),它就可以生成watchdog, agent, launcher等節點。同一個進程之中每個節點包含三個最關鍵的要素:上下文(context),句柄(handle),消息隊列(message_queue)。向不同的節點的handle發送消息,就是向該節點的消息組message_queue添加一個消息處理請求。該消息不會立馬被處理,等到work線程執行到該節點時,取到該消息的時候,纔會執行該消息請求,並運行相關的邏輯。

      假設一個進程中的節點是二維平面。那麼在多個進程的情況,平行展開,就可以形成一個三維空間。我猜測這就更加符合這個框架的名字“天網”的來源了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章