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

            久久午夜综合久久| 久久久WWW成人免费毛片| 日日躁夜夜躁狠狠久久AV| 久久SE精品一区二区| 久久国产热精品波多野结衣AV| 久久er国产精品免费观看2| 久久综合九色综合欧美就去吻| 亚洲精品乱码久久久久久蜜桃图片 | 无码久久精品国产亚洲Av影片 | 久久中文精品无码中文字幕| 伊人色综合九久久天天蜜桃| 精品久久亚洲中文无码| 精品久久久久久亚洲| 狠狠色丁香婷婷久久综合| 国产精品久久久久9999高清| 亚洲v国产v天堂a无码久久| 久久久久AV综合网成人| 欧美麻豆久久久久久中文| 潮喷大喷水系列无码久久精品| 久久有码中文字幕| 人人狠狠综合久久亚洲婷婷| 久久亚洲精品无码aⅴ大香 | 久久久婷婷五月亚洲97号色| 亚洲性久久久影院| 精品久久人人爽天天玩人人妻| 精品久久久久久中文字幕人妻最新| 老色鬼久久亚洲AV综合| 久久无码国产| 精品国产热久久久福利| 1000部精品久久久久久久久| 无码任你躁久久久久久老妇App| 精品国产综合区久久久久久| 久久99国产亚洲高清观看首页| 亚洲va中文字幕无码久久| 国产精品亚洲综合久久| 欧美激情精品久久久久久久| 超级碰久久免费公开视频| 成人久久精品一区二区三区| 久久久噜噜噜久久熟女AA片| 久久亚洲AV成人出白浆无码国产| 久久精品免费一区二区|