posts - 11, comments - 9, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          NIO的理解,請(qǐng)參照:http://www.goldendoc.org/category/java-nio/

          Netty的一些理解,請(qǐng)參照:

          http://www.kafka0102.com/2010/06/167.html

          http://rdc.taobao.com/team/jm/archives/423


          Netty的高可靠性,可伸縮性,以及效率的確讓人著迷,為什么Netty這么快呢?

          Netty高效的原因:

          1. 實(shí)現(xiàn)了多路Selector用于讀和注冊(cè),線程數(shù)量是cpu*2,reactor都是這么做的,自己處理寫(xiě)事件,這個(gè)我在自己框架中也是這么做的,nio的selector處理注冊(cè)和讀,并且也優(yōu)化了wakeup,Netty中的wakeup也是優(yōu)化過(guò)的,本身一次wakeup對(duì)Nio并不大,但是大批量并發(fā)的時(shí)候就需要進(jìn)行優(yōu)化處理了,只有當(dāng)selector堵塞的時(shí)候進(jìn)行wakeup,或者說(shuō)需要下次立刻返回的時(shí)候wakeup。
          2. Netty在開(kāi)啟多路讀寫(xiě)的時(shí)候,用的是DirectBuffer,并用了SoftReferrence來(lái)做緩存優(yōu)化,減少傳輸數(shù)據(jù)的內(nèi)存移動(dòng)和GC。還有預(yù)測(cè)數(shù)據(jù)算法,這個(gè)具體能不能提高有待討論
          3. 并發(fā)的控制,基于SEDA的設(shè)計(jì)理論構(gòu)建的高效事件模型,真正的異步處理,吞吐量和伸縮性都可以得到保證。


          nio的實(shí)現(xiàn)并不復(fù)雜,但想讓你的底層通訊,效率,以及可伸縮性和高可靠性做好,還是極具挑戰(zhàn)性的。


          目前有個(gè)項(xiàng)目是自己寫(xiě)的nio,但效率比起netty來(lái),小了幾個(gè)數(shù)量級(jí),當(dāng)然以本人一己之力能做到目前這個(gè)情況,還算自己滿意,也用到生產(chǎn)環(huán)境中了,一個(gè)web game,及時(shí)性要求很高,一臺(tái)server,5000人沒(méi)問(wèn)題。同時(shí)廣播消息在10000人以內(nèi),當(dāng)然有些優(yōu)化是在業(yè)務(wù)邏輯層面的。當(dāng)然比起netty的效率來(lái)講還是差了幾個(gè)數(shù)量級(jí)。


          除了高效,Netty在擴(kuò)展性方面做的不錯(cuò):

          1. 豐富的decoder/encoder實(shí)現(xiàn),你可以輕松的繼承一個(gè)類實(shí)現(xiàn)自己的邏輯,例如游戲中,直接繼承FiledLengthBaseFrameDecoder即可。
          2. 自行添加decoder或者encoder,自由的控制事件流向順序,通過(guò)這個(gè),可以實(shí)現(xiàn)一些協(xié)議加密解密,協(xié)議過(guò)濾器,統(tǒng)計(jì)工具等等
          3. 提供很多工具類:Timeout的一些實(shí)現(xiàn),還有ChannelBuffers的一些工具,通常情況下,我們?yōu)榱藴p少對(duì)Netty的依賴,會(huì)自己再封裝一層,以完全達(dá)到脫離Netty的目的,都會(huì)再次封裝一層ChannelBuffer,這樣目的是不要讓上層邏輯跟底層通訊有任何關(guān)聯(lián),降低耦合,當(dāng)然也在為考慮更換底層通訊而不影響上層邏輯。
          4. 提供監(jiān)聽(tīng)底層消息的ChannelFuture,例如發(fā)送完消息可以斷開(kāi)連接等等
          5. 可調(diào)控的通訊架構(gòu),可以根據(jù)業(yè)務(wù)的吞吐量來(lái)調(diào)整,Netty的各項(xiàng)參數(shù)不只有socket的一些設(shè)置,還能控制事件流順序和吞吐量的大小等等。


          最后,基于Netty我簡(jiǎn)單封裝了一個(gè)web game所具備的一些GameBuffer,目前比較簡(jiǎn)陋,后續(xù)可能加入一些別的功能。


          項(xiàng)目在:https://github.com/cuixin/XGameEnginee/



          評(píng)論

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層  回復(fù)  更多評(píng)論   

          2012-08-19 19:02 by rabee
          你好,一直使用mina,剛開(kāi)始研究netty,還沒(méi)在生產(chǎn)環(huán)境中使用,看了你的框架有些疑問(wèn),還望指教

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層  回復(fù)  更多評(píng)論   

          2012-08-20 10:59 by steven.cui
          @rabee 有什么問(wèn)題請(qǐng)講

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層  回復(fù)  更多評(píng)論   

          2012-09-29 12:11 by javavaj
          你好,看了下你的代碼,GameWorker是單線程嗎?

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層[未登錄](méi)  回復(fù)  更多評(píng)論   

          2012-12-07 18:32 by tony
          你好,我也做了兩年游戲,想和你有進(jìn)一步的溝通,我的郵箱:yong_xiaoyang@126.com,希望收到你的回復(fù),謝謝!

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層  回復(fù)  更多評(píng)論   

          2013-02-20 19:13 by 勤奮的asialee
          博主這塊寫(xiě)的挺好的,我完全看了,不過(guò)我也寫(xiě)了一些關(guān)于編解碼器的,請(qǐng)批評(píng)指正http://asialee.iteye.com/blog/1769508

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-07-20 00:06 by wade
          你好,你的代碼我有研究過(guò),寫(xiě)的很不錯(cuò),但是我想問(wèn)下你,怎么做到把消息隊(duì)排分開(kāi),提高游戲引擎吞吐量

          # re: Netty整理和基于Netty封裝了一個(gè)web game通訊層  回復(fù)  更多評(píng)論   

          2013-08-02 15:11 by steven.cui
          @wade
          目前我在研究erlang,java可以借鑒erlang的多進(jìn)程并發(fā)思想來(lái)做,Actor/SEDA設(shè)計(jì)模型可以增加吞吐量和并發(fā),如果你有C和lua經(jīng)驗(yàn),可以參考云風(fēng)的skynet,當(dāng)然還可以考慮Scala或者Clojure,Scala本身支持函數(shù)式,更有Actor模型存在,也有很多國(guó)內(nèi)的朋友在用Scala寫(xiě)游戲服務(wù)器。

          另外一個(gè)無(wú)鎖的消費(fèi)生產(chǎn)者模型,Disruptor,如果你有能力自己實(shí)現(xiàn)Actor/SEDA模型,可以將Disruptor嫁接進(jìn)來(lái)。

          游戲服務(wù)器的難度設(shè)計(jì)在于幾點(diǎn):
          1.多服務(wù)器的通訊和穩(wěn)定,以及各種容錯(cuò)機(jī)制,熱更新。
          2.快速迭代的測(cè)試模型和性能驗(yàn)證模型。(解決上下文的關(guān)聯(lián)問(wèn)題,我能想到的是盡量利用函數(shù)式語(yǔ)言來(lái)做)
          3.監(jiān)控和相應(yīng)的配置工具,目前Erlang的體系的確是很強(qiáng)大,幫你做了很多。

          至于XGameEnginne,我們之前的上線游戲,都是通過(guò)業(yè)務(wù)邏輯的方式分配線程,此方法不算是特別智能,但也在一定程度上可以解決部分并發(fā)的問(wèn)題,其實(shí)Erlang來(lái)做的話也可以這么設(shè)計(jì),但卻比Java有更好的辦法,畢竟Erlang對(duì)進(jìn)程的開(kāi)銷(xiāo)實(shí)在太小了。

          最后,選擇有很多,不要讓語(yǔ)言成為你的限制,當(dāng)然這是扯淡,關(guān)鍵是要找合適的:D
          主站蜘蛛池模板: 禹州市| 榆社县| 六枝特区| 武安市| 桦甸市| 苗栗县| 东辽县| 河源市| 扎赉特旗| 许昌县| 丽江市| 合水县| 高雄市| 青浦区| 襄汾县| 乐平市| 西丰县| 新昌县| 江陵县| 长宁区| 朝阳县| 同仁县| 泾川县| 三穗县| 谷城县| 涡阳县| 四平市| 拜城县| 宁津县| 嘉善县| 金阳县| 合肥市| 若尔盖县| 天长市| 长沙县| 永清县| 高安市| 涟源市| 万源市| 离岛区| 克什克腾旗|