• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            多線程+同步阻塞模型

            在我們的游戲項目中使用的golang服務器開發方式如下

            1.多線程邏輯

            2.同步阻塞. 也就是說, 每個人一個線程(goroutine), io線程=邏輯線程

            這種方式的優點:

            1. 同步阻塞方式與人的思維方式類同

            2. 邏輯處理性能有一定提升

            在大規模使用這種模式編寫邏輯后, 我們發現了這種模式只有1個缺點: 編寫者需要處理多線程關系

            但這本身確實直接致命的, 回想C++時代, 多線程處理時, 調試重現的困難… 腦補景象太慘不敢直視

            單線程+異步多進程模型

            在C++時代, 我曾經編寫過一套asio的C++服務器框架. 采用io多線程, 邏輯單線程, 依賴著C++高性能的優勢, 讓開發便捷簡單且無需關心線程問題.

            那么到了golang時代, 為什么不能試下單線程異步多進程方式來編寫邏輯?

            與多線程同步阻塞對比后, 我們發現, 兩者優缺點互補. 那這就回到了領域選型問題了. 對于游戲服務器需要的上手簡單, 開發便捷, 壓力降低(非MMO)這些特點來說, 單線程異步多進程再合適不過了

            那么, 我們在用golang編寫單線程異步多進程服務器應該注意哪些點呢?

            1. socket處理完全封裝, 只通過channel拋出到邏輯線程排隊處理

            2. 數據庫, rpc及其他io處理, 一律改為異步回調模式, 不使用同步接口

            3. 玩家存盤提交數據可以考慮復制并提交到存盤線程方式, 提高性能.

            4. 采用多進程架構, 比如設網關進程, 把io壓力分散到進程中

            5. 邏輯編寫中, 不允許使用go開線程及channel, 有需要提高性能部分需要單獨編寫

             

            Actor模型的痛

            cellnet在開發時本來考慮使用actor模型來進一步簡化多線程邏輯的麻煩, 經歷了一段時間的原型開發后, 發現了一些問題, 列舉如下:

            1. golang的強類型不適合actor模型這種經常需要動態生成各類消息的模型, 但skynet(C+lua)/erlang就有天生優勢

            2. actor模型本身不是萬能的, 不能解決所有需求, 特別是游戲

            3. actor模型理解到應用有一定的難度. 本身還需要搭建框架, 上手復雜

            總之, 看過一些erlang及skynet的用例, 沒有應用的很純正且成熟的成功actor模型案例, 從傳統socket服務器框架跨越到actor模型會扯到蛋, 因此, 后期cellnet會考慮回歸到成熟的socket服務器框架. 把架構做到簡單上手, 高擴展上.

            posted on 2015-09-09 19:06 戰魂小筑 閱讀(6704) 評論(6)  編輯 收藏 引用 所屬分類: 網絡 服務器技術Golang

            評論

            # re: 對golang服務器開發模式的一些思考 2015-09-09 23:43 威士忌
            我也是用單線程異步化的這種方式,現在是用tornado中coroutine和Future來實現。
            邏輯單線程,是無需擔心多線程問題,這點很舒服,但單線程無法很好利用多核也是覺得沒有最大化性能,或者游戲真是夠用就行。  回復  更多評論
              

            # re: 對golang服務器開發模式的一些思考[未登錄] 2015-09-10 11:37 Arthur
            1. 異步的做法在error handling那邊會比較疼的,

            同步的做法出錯了處理下就好了,Go語言的goroutine層的阻塞也不會讓底層阻塞。但是到了異步,Actor把消息丟給另一個Actor去執行,后面可能出錯,而錯誤信息的反饋就比較麻煩了。
            如果你要等結果出來,就又回到了同步時代。
            如果你不等執行結果,繼續往下走,那出錯了能回滾么?

            2. socket處理完全封裝, 只通過channel

            雖然看上去很美,性能上還是有缺陷的。
            每個連接會開兩個goroutine,中間還有channel數據傳遞引入的開銷。
            相比于epoll加回調,多執行了很多東西。goroutine is cheap,but not free

            3. 邏輯復雜以后,數據的歸屬難以處理

            Actor必然涉及到大量的消息交換。而為了效率這個肯定不是深拷貝數據的。既然還有內存共享,后面也不是一個很舒心的事情。模型出發點是不要處理低層的鎖相關,但還是不得不面臨這些問題。

            4. 一些帶執行順序的邏輯以及死鎖問題

            有些會有啟動順序或者服務依賴之類,這是用Actor模型做的時候很煩的東西。另外一個是有這種情況時,特別要注意成環死鎖。

            ....先說這些吧。同樓主一樣思考過這些東西,也踩過一些坑....
            都在探索,多交流。
              回復  更多評論
              

            # re: 對golang服務器開發模式的一些思考 2015-09-10 13:28 戰魂小筑
            @Arthur
            很給力的建言! 贊!

            P.S. 你用的Actor模型是erlang還是其他語言?  回復  更多評論
              

            # re: 對golang服務器開發模式的一些思考 2015-09-15 19:11 虞雙齊
            現在 游戲開發領域使用 Go 的越來越多了?  回復  更多評論
              

            # re: 對golang服務器開發模式的一些思考 2015-09-15 19:12 戰魂小筑
            @虞雙齊
            多  回復  更多評論
              

            # re: 對golang服務器開發模式的一些思考 2015-09-15 19:15 虞雙齊
            @戰魂小筑
            這回復速度,神!  回復  更多評論
              

            久久这里只精品99re66| 精品永久久福利一区二区| 久久久综合香蕉尹人综合网| 久久精品视频91| 久久久久亚洲AV成人片| 国产精品久久永久免费| 欧美激情精品久久久久久| 老色鬼久久亚洲AV综合| 久久久久久极精品久久久| 久久精品人人做人人爽电影 | 久久久亚洲精品蜜桃臀| 国产精品乱码久久久久久软件| 久久久久久无码Av成人影院| 欧美日韩中文字幕久久久不卡| 九九久久自然熟的香蕉图片| 中文精品99久久国产| 国产精品九九久久免费视频 | 色综合久久综精品| 97精品国产97久久久久久免费| 欧美精品福利视频一区二区三区久久久精品 | 久久精品成人欧美大片| 亚洲成色WWW久久网站| 91亚洲国产成人久久精品| 久久久久久亚洲精品成人| 中文字幕精品无码久久久久久3D日动漫 | 99久久国产综合精品麻豆| 中文精品99久久国产| 亚洲国产成人久久综合碰碰动漫3d| 久久人做人爽一区二区三区| 99热成人精品免费久久| 欧美亚洲国产精品久久蜜芽| 久久午夜伦鲁片免费无码| 亚洲精品无码久久久久sm| 中文字幕人妻色偷偷久久| 狠狠综合久久AV一区二区三区| 亚洲国产视频久久| 国产一区二区久久久| 久久免费视频1| 日韩AV无码久久一区二区| 伊人久久久AV老熟妇色| 久久久精品2019免费观看|