• <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 虞雙齊
            @戰魂小筑
            這回復速度,神!  回復  更多評論
              

            久久精品无码一区二区三区免费| 性高湖久久久久久久久AAAAA| 狠狠久久亚洲欧美专区| 77777亚洲午夜久久多喷| 久久精品这里热有精品| 国产毛片久久久久久国产毛片| 久久国产综合精品五月天| 欧美午夜A∨大片久久 | 久久综合伊人77777| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 2021少妇久久久久久久久久| 久久亚洲欧美日本精品| 久久免费视频一区| 精品久久人人爽天天玩人人妻| 精品少妇人妻av无码久久| 777久久精品一区二区三区无码| 久久久久亚洲爆乳少妇无| 久久久久国产精品人妻| 99久久免费国产特黄| 久久青青草原亚洲av无码| 久久精品日日躁夜夜躁欧美| 99久久99这里只有免费的精品| 精品久久久久久国产三级| 久久人妻少妇嫩草AV蜜桃| 丰满少妇人妻久久久久久 | 人人狠狠综合久久88成人| 色综合久久综精品| 久久久久久久免费视频| 国产精品久久久久影视不卡| 欧美麻豆久久久久久中文| 久久久久亚洲精品无码蜜桃| 久久九九免费高清视频| 亚洲精品乱码久久久久久中文字幕 | 久久久久久国产精品美女 | 久久有码中文字幕| 99久久国语露脸精品国产| 一本久久a久久精品综合香蕉| 激情伊人五月天久久综合| 亚洲国产精品一区二区三区久久| 99麻豆久久久国产精品免费| 久久综合亚洲色HEZYO社区|