1.
±³¾°
1.1. å´»úµÄ´ú¼Û
1.1.1. µçÐÅÐÐÒµ
±ÏÂíÍþ¹ú¼Ê(KPMG International)ÔÚ¶Ô46¸ö¹ú¼ÒµÄ74¼ÒÔËÓªÉ̽øÐе÷²éºó·¢ÏÖ£¬È«ÇòͨÐÅÐÐҵÿÄêµÄÊÕÒæÁ÷ʧԼΪ400ÒÚÃÀÔª£¬Õ¼×ÜÊÕÈëµÄ1%-3%¡£µ¼ÖÂÊÕÒæÁ÷ʧµÄÒòËØÓжàÖÖ£¬Ö÷ÒªÔÒò¾ÍÊǼƷÑBUG¡£
1.1.2. »¥ÁªÍøÐÐÒµ
ÃÀ¹ú̫ƽÑóʱ¼ä8ÔÂ16ÈÕÏÂÎç3µã50·Öµ½3µã55·Ö£¨±±¾©Ê±¼ä8ÔÂ17ÈÕ6µã50·Öµ½6µã55·Ö£©£¬¹È¸èÔâÓöÁËå´»ú¡£¸ù¾Ýʺóͳ¼Æ£¬¶Ì¶ÌµÄ5·ÖÖÓ£¬¹È¸èËðʧÁË54.5ÍòÃÀÔª¡£Ò²¾ÍÊÇ·þÎñÿÖжÏÒ»·ÖÖÓ£¬Ëðʧ¾Í´ï10.8ÍòÃÀÔª¡£
2013Ä꣬´ÓÃÀ¹ú¶«²¿Ê±¼ä8ÔÂ19ÈÕÏÂÎç2µã45·Ö¿ªÊ¼£¬ÓÐÓû§ÂÊÏÈ·¢ÏÖÁËÑÇÂíÑ·ÍøÕ¾³öÏÖå´»ú£¬´óÔ¼ÔÚ20¶à·ÖÖÓºóÓÖ»Ö¸´Õý³£¡£´Ë´Îå´»úÈÃÑÇÂíѷÿ·ÖÖÓËðʧ½ü6.7ÍòÃÀÔª£¬ÔÚå´»úÆÚ¼ä£¬Ïû·ÑÕßÎÞ·¨Í¨¹ýAmazon.com¡¢ÑÇÂíÑ·ÒÆ¶¯¶ËÒÔ¼°Amazon.caµÈÍøÕ¾½øÐйºÎï¡£
1.2. Èí¼þ¿É¿¿ÐÔ
Èí¼þ¿É¿¿ÐÔÊÇÖ¸ÔÚ¸ø¶¨Ê±¼äÄÚ£¬Ìض¨»·¾³ÏÂÈí¼þÎÞ´íÔËÐеĸÅÂÊ¡£Èí¼þ¿É¿¿ÐÔ°üº¬ÁËÒÔÏÂÈý¸öÒªËØ£º
1) ¹æ¶¨µÄʱ¼ä£ºÈí¼þ¿É¿¿ÐÔÖ»ÊÇÌåÏÖÔÚÆäÔËÐн׶Σ¬ËùÒÔ½«ÔËÐÐʱ¼ä×÷Ϊ¹æ¶¨µÄʱ¼äµÄ¶ÈÁ¿¡£ÔËÐÐʱ¼ä°üÀ¨Èí¼þϵͳÔËÐкó¹¤×÷Óë¹ÒÆð(¿ªÆôµ«¿ÕÏÐ)µÄÀÛ¼ÆÊ±¼ä¡£ÓÉÓÚÈí¼þÔËÐеĻ·¾³Óë³ÌÐò·¾¶Ñ¡È¡µÄËæ»úÐÔ£¬Èí¼þµÄÊ§Ð§ÎªËæ»úʼþ£¬ËùÒÔÔËÐÐʱ¼äÊôÓÚËæ»ú±äÁ¿;
2) ¹æ¶¨µÄ»·¾³Ìõ¼þ:»·¾³Ìõ¼þÖ¸Èí¼þµÄÔËÐл·¾³¡£ËüÉæ¼°Èí¼þϵͳÔËÐÐʱËùÐèµÄ¸÷ÖÖÖ§³ÖÒªËØ£¬ÈçÖ§³ÖÓ²¼þ¡¢²Ù×÷ϵͳ¡¢ÆäËüÖ§³ÖÈí¼þ¡¢ÊäÈëÊý¾Ý¸ñʽºÍ·¶Î§ÒÔ¼°²Ù×÷¹æ³ÌµÈ¡£²»Í¬µÄ»·¾³Ìõ¼þÏÂÈí¼þµÄ¿É¿¿ÐÔÊDz»Í¬µÄ¡£¾ßÌåµØËµ£¬¹æ¶¨µÄ»·¾³Ìõ¼þÖ÷ÒªÊÇÃèÊöÈí¼þϵͳÔËÐÐʱ¼ÆËã»úµÄÅäÖÃÇé¿öÒÔ¼°¶ÔÊäÈëÊý¾ÝµÄÒªÇ󣬲¢¼Ù¶¨ÆäËüÒ»ÇÐÒòËØ¶¼ÊÇÀíÏëµÄ¡£ÓÐÁËÃ÷È·¹æ¶¨µÄ»·¾³Ìõ¼þ£¬»¹¿ÉÒÔÓÐЧÅжÏÈí¼þʧЧµÄÔðÈÎÔÚÓû§·½»¹ÊÇÌṩ·½;
3) ¹æ¶¨µÄ¹¦ÄÜ:Èí¼þ¿É¿¿ÐÔ»¹Óë¹æ¶¨µÄÈÎÎñºÍ¹¦ÄÜÓйء£ÓÉÓÚÒªÍê³ÉµÄÈÎÎñ²»Í¬£¬Èí¼þµÄÔËÐÐÆÊÃæ»áÓÐËùÇø±ð£¬Ôòµ÷ÓõÄ×ÓÄ£¿é¾Í²»Í¬(¼´³ÌÐò·¾¶Ñ¡Ôñ²»Í¬)£¬Æä¿É¿¿ÐÔÒ²¾Í¿ÉÄܲ»Í¬¡£ËùÒÔҪ׼ȷ¶ÈÁ¿Èí¼þϵͳµÄ¿É¿¿ÐÔ±ØÐëÊ×ÏÈÃ÷È·ËüµÄÈÎÎñºÍ¹¦ÄÜ¡£
1.3. NettyµÄ¿É¿¿ÐÔ
Ê×ÏÈ£¬ÎÒÃÇÒª´ÓNettyµÄÖ÷ÒªÓÃ;À´·ÖÎöËüµÄ¿É¿¿ÐÔ£¬NettyĿǰµÄÖ÷Á÷Ó÷¨ÓÐÈýÖÖ£º
1) ¹¹½¨RPCµ÷ÓõĻù´¡Í¨ÐÅ×é¼þ£¬Ìṩ¿ç½ÚµãµÄÔ¶³Ì·þÎñµ÷ÓÃÄÜÁ¦£»
2) NIOͨÐÅ¿ò¼Ü£¬ÓÃÓÚ¿ç½ÚµãµÄÊý¾Ý½»»»£»
3) ÆäËüÓ¦ÓÃÐÒéÕ»µÄ»ù´¡Í¨ÐÅ×é¼þ£¬ÀýÈçHTTPÐÒéÒÔ¼°ÆäËü»ùÓÚNetty¿ª·¢µÄÓ¦ÓòãÐÒéÕ»¡£
ÒÔ°¢ÀïµÄ·Ö²¼Ê½·þÎñ¿ò¼ÜDubboΪÀý£¬NettyÊÇDubbo RPC¿ò¼ÜµÄºËÐÄ¡£ËüµÄ·þÎñµ÷ÓÃʾÀýͼÈçÏ£º

ͼ1-1 DubboµÄ½Úµã½Çɫ˵Ã÷ͼ
ÆäÖУ¬·þÎñÌṩÕߺͷþÎñµ÷ÓÃÕßÖ®¼ä¿ÉÒÔͨ¹ýDubboÐÒé½øÐÐRPCµ÷Óã¬ÏûÏ¢µÄÊÕ·¢Ä¬ÈÏͨ¹ýNettyÍê³É¡£
ͨ¹ý¶ÔNettyÖ÷Á÷Ó¦Óó¡¾°µÄ·ÖÎö£¬ÎÒÃÇ·¢ÏÖNettyÃæÁٵĿɿ¿ÐÔÎÊÌâ´óÖ·ÖΪÈýÀࣺ
1) ´«Í³µÄÍøÂçI/O¹ÊÕÏ£¬ÀýÈçÍøÂçÉÁ¶Ï¡¢·À»ðǽHangסÁ¬½Ó¡¢ÍøÂ糬ʱµÈ£»
2) NIOÌØÓеĹÊÕÏ£¬ÀýÈçNIOÀà¿âÌØÓеÄBUG¡¢¶Áд°ë°ü´¦ÀíÒì³£¡¢ReactorÏß³ÌÅܷɵȵȣ»
3) ±à½âÂëÏà¹ØµÄÒì³£¡£
ÔÚ´ó¶àÊýµÄÒµÎñÓ¦Óó¡¾°ÖУ¬Ò»µ©ÒòΪijЩ¹ÊÕϵ¼ÖÂNetty²»ÄÜÕý³£¹¤×÷£¬ÒµÎñÍùÍù»áÏÝÈë̱»¾¡£ËùÒÔ£¬´ÓÒµÎñËßÇóÀ´¿´£¬¶ÔNetty¿ò¼ÜµÄ¿É¿¿ÐÔÒªÇóÊǷdz£µÄ¸ß¡£×÷Ϊµ±Ç°Òµ½ç×îÁ÷ÐеÄÒ»¿îNIO¿ò¼Ü£¬NettyÔÚ²»Í¬ÐÐÒµºÍÁìÓò¶¼µÃµ½Á˹㷺µÄÓ¦Óã¬ËüµÄ¸ß¿É¿¿ÐÔÒѾµÃµ½Á˳ɰÙÉÏǧµÄÉú²úϵͳ¼ìÑé¡£
NettyÊÇÈçºÎÖ§³Öϵͳ¸ß¿É¿¿ÐԵģ¿ÏÂÃæ£¬ÎÒÃǾʹӼ¸¸ö²»Í¬Î¬¶È³ö·¢Ò»Ì½¾¿¾¹¡£
2. Netty¸ß¿É¿¿ÐÔÖ®µÀ
2.1. ÍøÂçͨÐÅÀà¹ÊÕÏ
2.1.1. ¿Í»§¶ËÁ¬½Ó³¬Ê±
ÔÚ´«Í³µÄͬ²½×èÈû±à³ÌģʽÏ£¬¿Í»§¶ËSocket·¢ÆðÍøÂçÁ¬½Ó£¬ÍùÍùÐèÒªÖ¸¶¨Á¬½Ó³¬Ê±Ê±¼ä£¬ÕâÑù×öµÄÄ¿µÄÖ÷ÒªÓÐÁ½¸ö£º
1) ÔÚͬ²½×èÈûI/OÄ£ÐÍÖУ¬Á¬½Ó²Ù×÷ÊÇͬ²½×èÈûµÄ£¬Èç¹û²»ÉèÖó¬Ê±Ê±¼ä£¬¿Í»§¶ËI/OÏ߳̿ÉÄܻᱻ³¤Ê±¼ä×èÈû£¬Õâ»áµ¼ÖÂϵͳ¿ÉÓÃI/OÏß³ÌÊýµÄ¼õÉÙ£»
2) ÒµÎñ²ãÐèÒª£º´ó¶àÊýϵͳ¶¼»á¶ÔÒµÎñÁ÷³ÌÖ´ÐÐʱ¼äÓÐÏÞÖÆ£¬ÀýÈçWEB½»»¥ÀàµÄÏìӦʱ¼äҪСÓÚ3S¡£¿Í»§¶ËÉèÖÃÁ¬½Ó³¬Ê±Ê±¼äÊÇΪÁËʵÏÖÒµÎñ²ãµÄ³¬Ê±¡£
JDKÔÉúµÄSocketÁ¬½Ó½Ó¿Ú¶¨ÒåÈçÏ£º

ͼ2-1 JDK SocketÁ¬½Ó³¬Ê±½Ó¿Ú
¶ÔÓÚNIOµÄSocketChannel£¬ÔÚ·Ç×èÈûģʽÏ£¬Ëü»áÖ±½Ó·µ»ØÁ¬½Ó½á¹û£¬Èç¹ûûÓÐÁ¬½Ó³É¹¦£¬Ò²Ã»Óз¢ÉúIOÒì³££¬ÔòÐèÒª½«SocketChannel×¢²áµ½SelectorÉϼàÌýÁ¬½Ó½á¹û¡£ËùÒÔ£¬Òì²½Á¬½ÓµÄ³¬Ê±ÎÞ·¨ÔÚAPI²ãÃæÖ±½ÓÉèÖ㬶øÊÇÐèҪͨ¹ý¶¨Ê±Æ÷À´Ö÷¶¯¼à²â¡£
ÏÂÃæÎÒÃÇÊ×ÏÈ¿´ÏÂJDK NIOÀà¿âµÄSocketChannelÁ¬½Ó½Ó¿Ú¶¨Ò壺

ͼ2-2 JDK NIO Àà¿âSocketChannelÁ¬½Ó½Ó¿Ú
´ÓÉÏÃæµÄ½Ó¿Ú¶¨Òå¿ÉÒÔ¿´³ö£¬NIOÀà¿â²¢Ã»ÓÐÏֳɵÄÁ¬½Ó³¬Ê±½Ó¿Ú¹©Óû§Ö±½ÓʹÓã¬Èç¹ûÒªÔÚNIO±à³ÌÖÐÖ§³ÖÁ¬½Ó³¬Ê±£¬ÍùÍùÐèÒªNIO¿ò¼Ü»òÕßÓû§×Ô¼º·âװʵÏÖ¡£
ÏÂÃæÎÒÃÇ¿´ÏÂNettyÊÇÈçºÎÖ§³ÖÁ¬½Ó³¬Ê±µÄ£¬Ê×ÏÈ£¬ÔÚ´´½¨NIO¿Í»§¶ËµÄʱºò£¬¿ÉÒÔÅäÖÃÁ¬½Ó³¬Ê±²ÎÊý£º

ͼ2-3 Netty¿Í»§¶Ë´´½¨Ö§³ÖÉèÖÃÁ¬½Ó³¬Ê±²ÎÊý
ÉèÖÃÍêÁ¬½Ó³¬Ê±Ö®ºó£¬NettyÔÚ·¢ÆðÁ¬½ÓµÄʱºò£¬»á¸ù¾Ý³¬Ê±Ê±¼ä´´½¨ScheduledFuture¹ÒÔØÔÚReactorÏß³ÌÉÏ£¬ÓÃÓÚ¶¨Ê±¼à²âÊÇ·ñ·¢ÉúÁ¬½Ó³¬Ê±£¬Ïà¹Ø´úÂëÈçÏ£º

ͼ2-4 ¸ù¾ÝÁ¬½Ó³¬Ê±´´½¨³¬Ê±¼à²â¶¨Ê±ÈÎÎñ
´´½¨Á¬½Ó³¬Ê±¶¨Ê±ÈÎÎñÖ®ºó£¬»áÓÉNioEventLoop¸ºÔðÖ´ÐС£Èç¹ûÒѾÁ¬½Ó³¬Ê±£¬µ«ÊÇ·þÎñ¶ËÈÔȻûÓзµ»ØTCPÎÕÊÖÓ¦´ð£¬Ôò¹Ø±ÕÁ¬½Ó£¬´úÂëÈçÉÏͼËùʾ¡£
Èç¹ûÔÚ³¬Ê±ÆÚÏÞÄÚ´¦ÀíÍê³ÉÁ¬½Ó²Ù×÷£¬ÔòÈ¡ÏûÁ¬½Ó³¬Ê±¶¨Ê±ÈÎÎñ£¬Ïà¹Ø´úÂëÈçÏ£º

ͼ2-5 È¡ÏûÁ¬½Ó³¬Ê±¶¨Ê±ÈÎÎñ
NettyµÄ¿Í»§¶ËÁ¬½Ó³¬Ê±²ÎÊýÓëÆäËü³£ÓõÄTCP²ÎÊýÒ»ÆðÅäÖã¬Ê¹ÓÃÆðÀ´·Ç³£·½±ã£¬ÉϲãÓû§²»ÓùØÐĵײãµÄ³¬Ê±ÊµÏÖ»úÖÆ¡£Õâ¼ÈÂú×ãÁËÓû§µÄ¸öÐÔ»¯ÐèÇó£¬ÓÖʵÏÖÁ˹ÊÕϵķֲã¸ôÀë¡£
2.1.2. ͨÐŶԶËÇ¿ÖÆ¹Ø±ÕÁ¬½Ó
ÔÚ¿Í»§¶ËºÍ·þÎñ¶ËÕý³£Í¨ÐŹý³ÌÖУ¬Èç¹û·¢ÉúÍøÂçÉÁ¶Ï¡¢¶Ô·½½ø³ÌͻȻ崻ú»òÕ߯äËü·ÇÕý³£¹Ø±ÕÁ´Â·Ê¼þʱ£¬TCPÁ´Â·¾Í»á·¢ÉúÒì³£¡£ÓÉÓÚTCPÊÇȫ˫¹¤µÄ£¬Í¨ÐÅË«·½¶¼ÐèÒª¹Ø±ÕºÍÊÍ·ÅSocket¾ä±ú²Å²»»á·¢Éú¾ä±úµÄй©¡£
ÔÚʵ¼ÊµÄNIO±à³Ì¹ý³ÌÖУ¬ÎÒÃǾ³£»á·¢ÏÖÓÉÓÚ¾ä±úûÓб»¼°Ê±¹Ø±Õµ¼ÖµĹ¦ÄܺͿɿ¿ÐÔÎÊÌâ¡£¾¿ÆäÔÒò×ܽáÈçÏ£º
1) IOµÄ¶ÁдµÈ²Ù×÷²¢·Ç½ö½ö¼¯ÖÐÔÚReactorÏß³ÌÄÚ²¿£¬Óû§ÉϲãµÄһЩ¶¨ÖÆÐÐΪ¿ÉÄܻᵼÖÂIO²Ù×÷µÄÍâÒÝ£¬ÀýÈçÒµÎñ×Ô¶¨ÒåÐÄÌø»úÖÆ¡£ÕâЩ¶¨ÖÆÐÐΪ¼Ó´óÁËͳһÒì³£´¦ÀíµÄÄѶȣ¬IO²Ù×÷Ô½·¢É¢£¬¹ÊÕÏ·¢ÉúµÄ¸ÅÂʾÍÔ½´ó£»
2) һЩÒì³£·Ö֧ûÓп¼Âǵ½£¬ÓÉÓÚÍⲿ»·¾³ÓÕÒòµ¼Ö³ÌÐò½øÈëÕâЩ·ÖÖ§£¬¾Í»áÒýÆð¹ÊÕÏ¡£
ÏÂÃæÎÒÃÇͨ¹ý¹ÊÕÏÄ£Ä⣬¿´NettyÊÇÈçºÎ´¦Àí¶Ô¶ËÁ´Â·Ç¿ÖƹرÕÒì³£µÄ¡£Ê×ÏÈÆô¶¯Netty·þÎñ¶ËºÍ¿Í»§¶Ë£¬TCPÁ´Â·½¨Á¢³É¹¦Ö®ºó£¬Ë«·½Î¬³Ö¸ÃÁ´Â·£¬²é¿´Á´Â·×´Ì¬£¬½á¹ûÈçÏ£º

ͼ2-6 Netty·þÎñ¶ËºÍ¿Í»§¶ËTCPÁ´Â·×´Ì¬Õý³£
Ç¿ÖÆ¹Ø±Õ¿Í»§¶Ë£¬Ä£Äâ¿Í»§¶Ëå´»ú£¬·þÎñ¶Ë¿ØÖÆÌ¨´òÓ¡ÈçÏÂÒì³££º

ͼ2-7 Ä£ÄâTCPÁ´Â·¹ÊÕÏ
´Ó¶ÑÕ»ÐÅÏ¢¿ÉÒÔÅжϣ¬·þÎñ¶ËÒѾ¼à¿Øµ½¿Í»§¶ËÇ¿ÖÆ¹Ø±ÕÁËÁ¬½Ó£¬ÏÂÃæÎÒÃÇ¿´Ï·þÎñ¶ËÊÇ·ñÒѾÊÍ·ÅÁËÁ¬½Ó¾ä±ú£¬ÔÙ´ÎÖ´ÐÐnetstatÃüÁִÐнá¹ûÈçÏ£º

ͼ2-8 ²é¿´¹ÊÕÏÁ´Â·×´Ì¬
´ÓÖ´Ðнá¹û¿ÉÒÔ¿´³ö£¬·þÎñ¶ËÒѾ¹Ø±ÕÁ˺Ϳͻ§¶ËµÄTCPÁ¬½Ó£¬¾ä±ú×ÊÔ´Õý³£ÊÍ·Å¡£ÓÉ´Ë¿ÉÒԵóö½áÂÛ£¬Nettyµ×²ãÒѾ×Ô¶¯¶Ô¸Ã¹ÊÕϽøÐÐÁË´¦Àí¡£
ÏÂÃæÎÒÃÇÒ»Æð¿´ÏÂNettyÊÇÈçºÎ¸ÐÖªµ½Á´Â·¹Ø±ÕÒì³£²¢½øÐÐÕýÈ·´¦ÀíµÄ£¬²é¿´AbstractByteBufµÄwriteBytes·½·¨£¬Ëü¸ºÔð½«Ö¸¶¨ChannelµÄ»º³åÇøÊý¾ÝдÈëµ½ByteBufÖУ¬Ïêϸ´úÂëÈçÏ£º

ͼ2-9 AbstractByteBufµÄwriteBytes·½·¨
ÔÚµ÷ÓÃSocketChannelµÄread·½·¨Ê±·¢ÉúÁËIOException£¬´úÂëÈçÏ£º

ͼ2-10 ¶ÁÈ¡»º³åÇøÊý¾Ý·¢ÉúIOÒì³£
ΪÁ˱£Ö¤IOÒì³£±»Í³Ò»´¦Àí£¬¸ÃÒì³£ÏòÉÏÅ×£¬ÓÉAbstractNioByteChannel½øÐÐͳһÒì³£´¦Àí£¬´úÂëÈçÏ£º

ͼ2-11 Á´Â·Òì³£Í˳öÒì³£´¦Àí
ΪÁËÄܹ»¶ÔÒì³£²ßÂÔ½øÐÐͳһ£¬Ò²ÎªÁË·½±ãά»¤£¬·ÀÖ¹´¦Àí²»µ±µ¼Öµľä±úй©µÈÎÊÌ⣬¾ä±úµÄ¹Ø±Õ£¬Í³Ò»µ÷ÓÃAbstractChannelµÄclose·½·¨£¬´úÂëÈçÏ£º

ͼ2-12 ͳһµÄSocket¾ä±ú¹Ø±Õ½Ó¿Ú
2.1.3. Õý³£µÄÁ¬½Ó¹Ø±Õ
¶ÔÓÚ¶ÌÁ¬½ÓÐÒ飬ÀýÈçHTTPÐÒ飬ͨÐÅË«·½Êý¾Ý½»»¥Íê³ÉÖ®ºó£¬Í¨³£°´ÕÕË«·½µÄÔ¼¶¨ÓÉ·þÎñ¶Ë¹Ø±ÕÁ¬½Ó£¬¿Í»§¶Ë»ñµÃTCPÁ¬½Ó¹Ø±ÕÇëÇóÖ®ºó£¬¹Ø±Õ×ÔÉíµÄSocketÁ¬½Ó£¬Ë«·½Õýʽ¶Ï¿ªÁ¬½Ó¡£
ÔÚʵ¼ÊµÄNIO±à³Ì¹ý³ÌÖУ¬¾³£´æÔÚÒ»ÖÖÎóÇø£ºÈÏΪֻҪÊǶԷ½¹Ø±ÕÁ¬½Ó£¬¾Í»á·¢ÉúIOÒì³££¬²¶»ñIOÒì³£Ö®ºóÔٹرÕÁ¬½Ó¼´¿É¡£Êµ¼ÊÉÏ£¬Á¬½ÓµÄºÏ·¨¹Ø±Õ²»»á·¢ÉúIOÒì³££¬ËüÊÇÒ»ÖÖÕý³£³¡¾°£¬Èç¹ûÒÅ©Á˸ó¡¾°µÄÅжϺʹ¦Àí¾Í»áµ¼ÖÂÁ¬½Ó¾ä±úй©¡£
ÏÂÃæÎÒÃÇÒ»ÆðÄ£Äâ¹ÊÕÏ£¬¿´NettyÊÇÈçºÎ´¦ÀíµÄ¡£²âÊÔ³¡¾°Éè¼ÆÈçÏ£º¸ÄÔìÏÂNetty¿Í»§¶Ë£¬Ë«·¢Á´Â·½¨Á¢³É¹¦Ö®ºó£¬µÈ´ý120S£¬¿Í»§¶ËÕý³£¹Ø±ÕÁ´Â·¡£¿´·þÎñ¶ËÊÇ·ñÄܹ»¸ÐÖª²¢Êͷžä±ú×ÊÔ´¡£
Ê×ÏÈÆô¶¯Netty¿Í»§¶ËºÍ·þÎñ¶Ë,Ë«·½TCPÁ´Â·Á¬½ÓÕý³££º

ͼ2-13 TCPÁ¬½Ó״̬Õý³£
120SÖ®ºó£¬¿Í»§¶Ë¹Ø±ÕÁ¬½Ó£¬½ø³ÌÍ˳ö£¬ÎªÁËÄܹ»¿´µ½Õû¸ö´¦Àí¹ý³Ì£¬ÎÒÃÇÔÚ·þÎñ¶ËµÄReactorÏ̴߳¦ÉèÖöϵ㣬ÏȲ»×ö´¦Àí£¬´ËʱÁ´Â·×´Ì¬ÈçÏ£º

ͼ2-14 TCPÁ¬½Ó¾ä±úµÈ´ýÊÍ·Å
´ÓÉÏͼ¿ÉÒÔ¿´³ö£¬´Ëʱ·þÎñ¶Ë²¢Ã»ÓйرÕSocketÁ¬½Ó£¬Á´Â·´¦ÓÚCLOSE_WAIT״̬£¬·Å¿ª´úÂëÈ÷þÎñ¶ËÖ´ÐÐÍ꣬½á¹ûÈçÏ£º

ͼ2-15 TCPÁ¬½Ó¾ä±úÕý³£ÊÍ·Å
ÏÂÃæÎÒÃÇÒ»Æð¿´Ï·þÎñ¶ËÊÇÈçºÎÅжϳö¿Í»§¶Ë¹Ø±ÕÁ¬½ÓµÄ£¬µ±Á¬½Ó±»¶Ô·½ºÏ·¨¹Ø±Õºó£¬±»¹Ø±ÕµÄSocketChannel»á´¦ÓÚ¾ÍÐ÷״̬£¬SocketChannelµÄread²Ù×÷·µ»ØÖµÎª-1£¬ËµÃ÷Á¬½ÓÒѾ±»¹Ø±Õ£¬´úÂëÈçÏ£º

ͼ2-16 ÐèÒª¶Ô¶ÁÈ¡µÄ×Ö½ÚÊý½øÐÐÅжÏ
Èç¹ûSocketChannel±»ÉèÖÃΪ·Ç×èÈû£¬ÔòËüµÄread²Ù×÷¿ÉÄÜ·µ»ØÈý¸öÖµ£º
1) ´óÓÚ0£¬±íʾ¶ÁÈ¡µ½ÁË×Ö½ÚÊý£»
2) µÈÓÚ0£¬Ã»ÓжÁÈ¡µ½ÏûÏ¢£¬¿ÉÄÜTCP´¦ÓÚKeep-Alive״̬£¬½ÓÊÕµ½µÄÊÇTCPÎÕÊÖÏûÏ¢£»
3) -1£¬Á¬½ÓÒѾ±»¶Ô·½ºÏ·¨¹Ø±Õ¡£
ͨ¹ýµ÷ÊÔ£¬ÎÒÃÇ·¢ÏÖ£¬NIOÀà¿âµÄ·µ»ØÖµÈ·ÊµÎª-1£º

ͼ2-17 Á´Â·Õý³£¹Ø±Õ£¬·µ»ØÖµÎª-1
µÃÖªÁ¬½Ó¹Ø±ÕÖ®ºó£¬Netty½«¹Ø±Õ²Ù×÷λÉèÖÃΪtrue,¹Ø±Õ¾ä±ú£¬´úÂëÈçÏ£º

ͼ2-18 Á¬½ÓÕý³£¹Ø±Õ£¬ÊÍ·Å×ÊÔ´
2.1.4. ¹ÊÕ϶¨ÖÆ
ÔÚ´ó¶àÊý³¡¾°Ï£¬µ±µ×²ãÍøÂç·¢Éú¹ÊÕϵÄʱºò£¬Ó¦¸ÃÓɵײãµÄNIO¿ò¼Ü¸ºÔðÊÍ·Å×ÊÔ´£¬´¦ÀíÒì³£µÈ¡£ÉϲãµÄÒµÎñÓ¦Óò»ÐèÒª¹ØÐĵײãµÄ´¦Àíϸ½Ú¡£µ«ÊÇ£¬ÔÚÒ»Ð©ÌØÊâµÄ³¡¾°Ï£¬Óû§¿ÉÄÜÐèÒª¸ÐÖªÕâЩÒì³££¬²¢Õë¶ÔÕâЩÒì³£½øÐж¨ÖÆ´¦Àí£¬ÀýÈ磺
1) ¿Í»§¶ËµÄ¶ÏÁ¬ÖØÁ¬»úÖÆ£»
2) ÏûÏ¢µÄ»º´æÖØ·¢£»
3) ½Ó¿ÚÈÕÖ¾ÖÐÏêϸ¼Ç¼¹ÊÕÏϸ½Ú£»
4) ÔËάÏà¹Ø¹¦ÄÜ£¬ÀýÈç¸æ¾¯¡¢´¥·¢Óʼþ/¶ÌÐŵÈ
NettyµÄ´¦Àí²ßÂÔÊÇ·¢ÉúIOÒì³££¬µ×²ãµÄ×ÊÔ´ÓÉËü¸ºÔðÊÍ·Å£¬Í¬Ê±½«Òì³£¶ÑÕ»ÐÅÏ¢ÒÔʼþµÄÐÎʽ֪ͨ¸øÉϲãÓû§£¬ÓÉÓû§¶ÔÒì³£½øÐж¨ÖÆ¡£ÕâÖÖ´¦Àí»úÖÆ¼È±£Ö¤ÁËÒì³£´¦ÀíµÄ°²È«ÐÔ£¬Ò²ÏòÉϲãÌṩÁËÁé»îµÄ¶¨ÖÆÄÜÁ¦¡£
¾ßÌå½Ó¿Ú¶¨ÒåÒÔ¼°Ä¬ÈÏʵÏÖÈçÏ£º

ͼ2-19 ¹ÊÕ϶¨ÖƽӿÚ
Óû§¿ÉÒÔ¸²¸Ç¸Ã½Ó¿Ú£¬½øÐиöÐÔ»¯µÄÒì³£¶¨ÖÆ¡£ÀýÈç·¢ÆðÖØÁ¬µÈ¡£
2.2. Á´Â·µÄÓÐЧÐÔ¼ì²â
µ±ÍøÂç·¢Éúµ¥Í¨¡¢Á¬½Ó±»·À»ðǽHangס¡¢³¤Ê±¼äGC»òÕßͨÐÅÏ̷߳¢Éú·ÇÔ¤ÆÚÒ쳣ʱ£¬»áµ¼ÖÂÁ´Â·²»¿ÉÓÃÇÒ²»Ò×±»¼°Ê±·¢ÏÖ¡£ÌرðÊÇÒì³£·¢ÉúÔÚÁ賿ҵÎñµÍ¹ÈÆÚ¼ä£¬µ±Ô糿ҵÎñ¸ß·åÆÚµ½À´Ê±£¬ÓÉÓÚÁ´Â·²»¿ÉÓûᵼÖÂ˲¼äµÄ´óÅúÁ¿ÒµÎñʧ°Ü»òÕß³¬Ê±£¬Õ⽫¶ÔϵͳµÄ¿É¿¿ÐÔ²úÉúÖØ´óµÄÍþв¡£
´Ó¼¼Êõ²ãÃæ¿´£¬Òª½â¾öÁ´Â·µÄ¿É¿¿ÐÔÎÊÌ⣬±ØÐëÖÜÆÚÐԵĶÔÁ´Â·½øÐÐÓÐЧÐÔ¼ì²â¡£Ä¿Ç°×îÁ÷ÐкÍͨÓõÄ×ö·¨¾ÍÊÇÐÄÌø¼ì²â¡£
ÐÄÌø¼ì²â»úÖÆ·ÖΪÈý¸ö²ãÃæ£º
1) TCP²ãÃæµÄÐÄÌø¼ì²â£¬¼´TCPµÄKeep-Alive»úÖÆ£¬ËüµÄ×÷ÓÃÓòÊÇÕû¸öTCPÐÒéÕ»£»
2) ÐÒé²ãµÄÐÄÌø¼ì²â£¬Ö÷Òª´æÔÚÓÚ³¤Á¬½ÓÐÒéÖС£ÀýÈçSMPPÐÒ飻
3) Ó¦ÓòãµÄÐÄÌø¼ì²â£¬ËüÖ÷ÒªÓɸ÷ÒµÎñ²úƷͨ¹ýÔ¼¶¨·½Ê½¶¨Ê±¸ø¶Ô·½·¢ËÍÐÄÌøÏûϢʵÏÖ¡£
ÐÄÌø¼ì²âµÄÄ¿µÄ¾ÍÊÇÈ·Èϵ±Ç°Á´Â·¿ÉÓ㬶Է½»î×Ų¢ÇÒÄܹ»Õý³£½ÓÊպͷ¢ËÍÏûÏ¢¡£
×öΪ¸ß¿É¿¿µÄNIO¿ò¼Ü£¬NettyÒ²ÌṩÁËÐÄÌø¼ì²â»úÖÆ£¬ÏÂÃæÎÒÃÇÒ»ÆðÊìϤÏÂÐÄÌøµÄ¼ì²âÔÀí¡£

ͼ2-20 ÐÄÌø¼ì²â»úÖÆ
²»Í¬µÄÐÒ飬ÐÄÌø¼ì²â»úÖÆÒ²´æÔÚ²îÒ죬¹éÄÉÆðÀ´Ö÷Òª·ÖΪÁ½Àࣺ
1) Ping-PongÐÍÐÄÌø£ºÓÉͨÐÅÒ»·½¶¨Ê±·¢ËÍPingÏûÏ¢£¬¶Ô·½½ÓÊÕµ½PingÏûÏ¢Ö®ºó£¬Á¢¼´·µ»ØPongÓ¦´ðÏûÏ¢¸ø¶Ô·½£¬ÊôÓÚÇëÇó-ÏìÓ¦ÐÍÐÄÌø£»
2) Ping-PingÐÍÐÄÌø£º²»Çø·ÖÐÄÌøÇëÇóºÍÓ¦´ð£¬ÓÉͨÐÅË«·½°´ÕÕÔ¼¶¨¶¨Ê±Ïò¶Ô·½·¢ËÍÐÄÌøPingÏûÏ¢£¬ËüÊôÓÚË«ÏòÐÄÌø¡£
ÐÄÌø¼ì²â²ßÂÔÈçÏ£º
1) Á¬ÐøN´ÎÐÄÌø¼ì²â¶¼Ã»ÓÐÊÕµ½¶Ô·½µÄPongÓ¦´ðÏûÏ¢»òÕßPingÇëÇóÏûÏ¢£¬ÔòÈÏΪÁ´Â·ÒѾ·¢ÉúÂ߼ʧЧ£¬Õâ±»³Æ×÷ÐÄÌø³¬Ê±£»
2) ¶ÁÈ¡ºÍ·¢ËÍÐÄÌøÏûÏ¢µÄʱºòÈçºÎÖ±½Ó·¢ÉúÁËIOÒì³££¬ËµÃ÷Á´Â·ÒѾʧЧ£¬Õâ±»³ÆÎªÐÄÌøÊ§°Ü¡£
ÎÞÂÛ·¢ÉúÐÄÌø³¬Ê±»¹ÊÇÐÄÌøÊ§°Ü£¬¶¼ÐèÒª¹Ø±ÕÁ´Â·£¬Óɿͻ§¶Ë·¢ÆðÖØÁ¬²Ù×÷£¬±£Ö¤Á´Â·Äܹ»»Ö¸´Õý³£¡£
NettyµÄÐÄÌø¼ì²âʵ¼ÊÉÏÊÇÀûÓÃÁËÁ´Â·¿ÕÏмì²â»úÖÆÊµÏֵģ¬Ïà¹Ø´úÂëÈçÏ£º

ͼ2-21 ÐÄÌø¼ì²âµÄ´úÂë°ü·¾¶
NettyÌṩµÄ¿ÕÏмì²â»úÖÆ·ÖΪÈýÖÖ£º
1) ¶Á¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ätûÓжÁÈ¡µ½ÈκÎÏûÏ¢£»
2) д¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ätûÓз¢ËÍÈκÎÏûÏ¢£»
3) ¶Áд¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ätûÓнÓÊÕ»òÕß·¢ËÍÈκÎÏûÏ¢¡£
NettyµÄĬÈ϶Áд¿ÕÏлúÖÆÊÇ·¢Éú³¬Ê±Òì³££¬¹Ø±ÕÁ¬½Ó£¬µ«ÊÇ£¬ÎÒÃÇ¿ÉÒÔ¶¨ÖÆËüµÄ³¬Ê±ÊµÏÖ»úÖÆ£¬ÒÔ±ãÖ§³Ö²»Í¬µÄÓû§³¡¾°¡£
WriteTimeoutHandlerµÄ³¬Ê±½Ó¿ÚÈçÏ£º

ͼ2-22 д³¬Ê±
ReadTimeoutHandlerµÄ³¬Ê±½Ó¿ÚÈçÏ£º

ͼ2-23 ¶Á³¬Ê±
¶Áд¿ÕÏеĽӿÚÈçÏ£º

ͼ2-24 ¶Áд¿ÕÏÐ
ÀûÓÃNettyÌṩµÄÁ´Â·¿ÕÏмì²â»úÖÆ£¬¿ÉÒԷdz£Áé»îµÄʵÏÖÐÒé²ãµÄÐÄÌø¼ì²â¡£ÔÚ¡¶NettyȨÍþÖ¸ÄÏ¡·ÖеÄ˽ÓÐÐÒéÕ»Éè¼ÆºÍ¿ª·¢Õ½ڣ¬ÎÒÀûÓÃNettyÌṩµÄ×Ô¶¨ÒåTask½Ó¿ÚʵÏÖÁËÁíÒ»ÖÖÐÄÌø¼ì²â»úÖÆ£¬¸ÐÐËȤµÄÅóÓÑ¿ÉÒÔ²ÎÔĸÃÊé¡£
2.3. ReactorÏ̵߳ı£»¤
ReactorÏß³ÌÊÇIO²Ù×÷µÄºËÐÄ£¬NIO¿ò¼ÜµÄ·¢¶¯»ú£¬Ò»µ©³öÏÖ¹ÊÕÏ£¬½«»áµ¼Ö¹ÒÔØÔÚÆäÉÏÃæµÄ¶à·Óø´ÓÃÆ÷ºÍ¶à¸öÁ´Â·ÎÞ·¨Õý³£¹¤×÷¡£Òò´ËËüµÄ¿É¿¿ÐÔÒªÇó·Ç³£¸ß¡£
±ÊÕß¾ÍÔø¾Óöµ½¹ýÒòΪÒì³£´¦Àí²»µ±µ¼ÖÂReactorÏß³ÌÅÜ·É£¬´óÁ¿ÒµÎñÇëÇó´¦Àíʧ°ÜµÄ¹ÊÕÏ¡£ÏÂÃæÎÒÃÇÒ»Æð¿´ÏÂNettyÊÇÈçºÎÓÐЧÌáÉýReactorÏ̵߳Ŀɿ¿ÐԵġ£
2.3.1. Òì³£´¦ÀíÒªµ±ÐÄ
¾¡¹ÜReactorÏß³ÌÖ÷Òª´¦ÀíIO²Ù×÷£¬·¢ÉúµÄÒ쳣ͨ³£ÊÇIOÒì³££¬µ«ÊÇ£¬Êµ¼ÊÉÏÔÚÒ»Ð©ÌØÊⳡ¾°Ï»ᷢÉú·ÇIOÒì³££¬Èç¹û½ö½ö²¶»ñIOÒì³£¿ÉÄܾͻᵼÖÂReactorÏß³ÌÅÜ·É¡£ÎªÁË·ÀÖ¹·¢ÉúÕâÖÖÒâÍ⣬ÔÚÑ»·ÌåÄÚÒ»¶¨Òª²¶»ñThrowable£¬¶ø²»ÊÇIOÒì³£»òÕßException¡£
NettyµÄÏà¹Ø´úÂëÈçÏ£º

ͼ2-25 ReactorÏß³ÌÒì³£±£»¤
²¶»ñThrowableÖ®ºó£¬¼´±ã·¢ÉúÁËÒâÍâδ֪¶ÔÒì³££¬Ïß³ÌÒ²²»»áÅÜ·É£¬ËüÐÝÃß1S£¬·ÀÖ¹ËÀÑ»·µ¼ÖµÄÒì³£ÈÆ½Ó£¬È»ºó¼ÌÐø»Ö¸´Ö´ÐС£ÕâÑù´¦ÀíµÄºËÐÄÀíÄî¾ÍÊÇ£º
1) ij¸öÏûÏ¢µÄÒì³£²»Ó¦¸Ãµ¼ÖÂÕûÌõÁ´Â·²»¿ÉÓã»
2) ijÌõÁ´Â·²»¿ÉÓò»Ó¦¸Ãµ¼ÖÂÆäËüÁ´Â·²»¿ÉÓã»
3) ij¸ö½ø³Ì²»¿ÉÓò»Ó¦¸Ãµ¼ÖÂÆäËü¼¯Èº½Úµã²»¿ÉÓá£
2.3.2. ËÀÑ»·±£»¤
ͨ³£Çé¿öÏ£¬ËÀÑ»·Êǿɼì²â¡¢¿ÉÔ¤·Àµ«ÊÇÎÞ·¨ÍêÈ«±ÜÃâµÄ¡£ReactorÏß³Ìͨ³£´¦ÀíµÄ¶¼ÊÇIOÏà¹ØµÄ²Ù×÷£¬Òò´ËÎÒÃÇÖØµã¹Ø×¢IO²ãÃæµÄËÀÑ»·¡£
JDK NIOÀà¿â×îÖøÃûµÄ¾ÍÊÇ epoll bugÁË£¬Ëü»áµ¼ÖÂSelector¿ÕÂÖѯ£¬IOÏß³ÌCPU
100%£¬ÑÏÖØÓ°ÏìϵͳµÄ°²È«ÐԺͿɿ¿ÐÔ¡£
SUNÔÚJKD1.6 update18°æ±¾Éù³Æ½â¾öÁ˸ÃBUG£¬µ«ÊǸù¾ÝÒµ½çµÄ²âÊԺʹó¼ÒµÄ·´À¡£¬Ö±µ½JDK1.7µÄÔçÆÚ°æ±¾£¬¸ÃBUGÒÀÈ»´æÔÚ£¬²¢Ã»ÓÐÍêÈ«±»ÐÞ¸´¡£·¢Éú¸ÃBUGµÄÖ÷»ú×ÊÔ´Õ¼ÓÃͼÈçÏ£º

ͼ2-26 epoll bug CPU¿ÕÂÖѯ
SUNÔÚ½â¾ö¸ÃBUGµÄÎÊÌâÉϲ»¸øÁ¦£¬Ö»ÄÜ´ÓNIO¿ò¼Ü²ãÃæ½øÐÐÎÊÌâ¹æ±Ü£¬ÏÂÃæÎÒÃÇ¿´ÏÂNettyÊÇÈçºÎ½â¾ö¸ÃÎÊÌâµÄ¡£
NettyµÄ½â¾ö²ßÂÔ£º
1) ¸ù¾Ý¸ÃBUGµÄÌØÕ÷£¬Ê×ÏÈÕì²â¸ÃBUGÊÇ·ñ·¢Éú£»
2) ½«ÎÊÌâSelectorÉÏ×¢²áµÄChannel×ªÒÆµ½Ð½¨µÄSelectorÉÏ£»
3) ÀϵÄÎÊÌâSelector¹Ø±Õ£¬Ê¹ÓÃн¨µÄSelectorÌæ»»¡£
ÏÂÃæ¾ßÌå¿´Ï´úÂ룬Ê×Ïȼì²âÊÇ·ñ·¢ÉúÁ˸ÃBUG£º

ͼ2-27 epoll bug ¼ì²â
Ò»µ©¼ì²â·¢Éú¸ÃBUG£¬ÔòÖØ½¨Selector£¬´úÂëÈçÏ£º

ͼ2-28 ÖØ½¨Selector
ÖØ½¨Íê³ÉÖ®ºó£¬Ìæ»»ÀϵÄSelector£¬´úÂëÈçÏ£º

ͼ2-29 Ìæ»»Selector
´óÁ¿Éú²úϵͳµÄÔËÐбíÃ÷£¬NettyµÄ¹æ±Ü²ßÂÔ¿ÉÒÔ½â¾öepoll bug
µ¼ÖµÄIOÏß³ÌCPUËÀÑ»·ÎÊÌâ¡£
2.4. ÓÅÑÅÍ˳ö
JavaµÄÓÅÑÅÍ£»úͨ³£Í¨¹ý×¢²áJDKµÄShutdownHookÀ´ÊµÏÖ£¬µ±ÏµÍ³½ÓÊÕµ½Í˳öÖ¸Áîºó£¬Ê×Ïȱê¼Çϵͳ´¦ÓÚÍ˳ö״̬£¬²»ÔÙ½ÓÊÕеÄÏûÏ¢£¬È»ºó½«»ýѹµÄÏûÏ¢´¦ÀíÍ꣬×îºóµ÷ÓÃ×ÊÔ´»ØÊÕ½Ó¿Ú½«×ÊÔ´Ïú»Ù£¬×îºó¸÷Ïß³ÌÍ˳öÖ´ÐС£
ͨ³£ÓÅÑÅÍ˳öÓиöʱ¼äÏÞÖÆ£¬ÀýÈç30S£¬Èç¹ûµ½´ïÖ´ÐÐʱ¼äÈÔȻûÓÐÍê³ÉÍ˳öǰµÄ²Ù×÷£¬ÔòÓÉ¼à¿Ø½Å±¾Ö±½Ókill
-9 pid£¬Ç¿ÖÆÍ˳ö¡£
NettyµÄÓÅÑÅÍ˳ö¹¦ÄÜËæ×Ű汾µÄÓÅ»¯ºÍÑݽøÒ²ÔÚ²»¶ÏµÄÔöÇ¿£¬ÏÂÃæÎÒÃÇÒ»Æð¿´ÏÂNetty5µÄÓÅÑÅÍ˳ö¡£
Ê×ÏÈ¿´ÏÂReactorÏ̺߳ÍÏß³Ì×飬ËüÃÇÌṩÁËÓÅÑÅÍ˳ö½Ó¿Ú¡£EventExecutorGroupµÄ½Ó¿Ú¶¨ÒåÈçÏ£º

ͼ2-30 EventExecutorGroupÓÅÑÅÍ˳ö
NioEventLoopµÄ×ÊÔ´ÊͷŽӿÚʵÏÖ£º

ͼ2-31 NioEventLoop×ÊÔ´ÊÍ·Å
ChannelPipelineµÄ¹Ø±Õ½Ó¿Ú£º

ͼ2-32 ChannelPipeline¹Ø±Õ½Ó¿Ú
ĿǰNettyÏòÓû§ÌṩµÄÖ÷Òª½Ó¿ÚºÍÀà¿â¶¼ÌṩÁË×ÊÔ´Ïú»ÙºÍÓÅÑÅÍ˳öµÄ½Ó¿Ú£¬Óû§µÄ×Ô¶¨ÒåʵÏÖÀà¿ÉÒԼ̳ÐÕâЩ½Ó¿Ú£¬Íê³ÉÓû§×ÊÔ´µÄÊͷźÍÓÅÑÅÍ˳ö¡£
2.5. ÄÚ´æ±£»¤
2.5.1. »º³åÇøµÄÄÚ´æÐ¹Â©±£»¤
ΪÁËÌáÉýÄÚ´æµÄÀûÓÃÂÊ£¬NettyÌṩÁËÄÚ´æ³ØºÍ¶ÔÏ󳨡£µ«ÊÇ£¬»ùÓÚ»º´æ³ØÊµÏÖÒÔºóÐèÒª¶ÔÄÚ´æµÄÉêÇëºÍÊͷŽøÐÐÑϸñµÄ¹ÜÀí£¬·ñÔòºÜÈÝÒ×µ¼ÖÂÄÚ´æÐ¹Â©¡£
Èç¹û²»²ÉÓÃÄÚ´æ³Ø¼¼ÊõʵÏÖ£¬Ã¿´Î¶ÔÏó¶¼ÊÇÒÔ·½·¨µÄ¾Ö²¿±äÁ¿ÐÎʽ±»´´½¨£¬Ê¹ÓÃÍê³ÉÖ®ºó£¬Ö»Òª²»ÔÙ¼ÌÐøÒýÓÃËü£¬JVM»á×Ô¶¯ÊÍ·Å¡£µ«ÊÇ£¬Ò»µ©ÒýÈëÄÚ´æ³Ø»úÖÆ£¬¶ÔÏóµÄÉúÃüÖÜÆÚ½«ÓÉÄÚ´æ³Ø¸ºÔð¹ÜÀí£¬Õâͨ³£ÊǸöÈ«¾ÖÒýÓã¬Èç¹û²»ÏÔʽÊÍ·ÅJVMÊDz»»á»ØÊÕÕⲿ·ÖÄÚ´æµÄ¡£
¶ÔÓÚNettyµÄÓû§¶øÑÔ£¬Ê¹ÓÃÕߵļ¼Êõˮƽ²îÒìºÜ´ó£¬Ò»Ð©¶ÔJVMÄÚ´æÄ£ÐͺÍÄÚ´æÐ¹Â©»úÖÆ²»Á˽âµÄÓû§£¬¿ÉÄÜÖ»¼ÇµÃÉêÇëÄڴ棬Íü¼ÇÖ÷¶¯ÊÍ·ÅÄÚ´æ£¬ÌØ±ðÊÇJAVA³ÌÐòÔ±¡£
ΪÁË·ÀÖ¹ÒòΪÓû§ÒÅ©µ¼ÖÂÄÚ´æÐ¹Â©£¬NettyÔÚPipe lineµÄβHandlerÖÐ×Ô¶¯¶ÔÄÚ´æ½øÐÐÊÍ·Å£¬Ïà¹Ø´úÂëÈçÏ£º

ͼ2-33 TailHandlerµÄÄÚ´æ»ØÊÕ²Ù×÷
¶ÔÓÚÄÚ´æ³Ø£¬Êµ¼Ê¾ÍÊǽ«»º³åÇøÖØÐ·ŵ½ÄÚ´æ³ØÖÐÑ»·Ê¹Ó㬴úÂëÈçÏ£º

ͼ2-34 PooledByteBufµÄÄÚ´æ»ØÊÕ²Ù×÷
2.5.2. »º³åÇøÄÚ´æÒç³ö±£»¤
×ö¹ýÐÒéÕ»µÄ¶ÁÕß¶¼ÖªµÀ£¬µ±ÎÒÃǶÔÏûÏ¢½øÐнâÂëµÄʱºò£¬ÐèÒª´´½¨»º³åÇø¡£»º³åÇøµÄ´´½¨·½Ê½Í¨³£ÓÐÁ½ÖÖ£º
1) ÈÝÁ¿Ô¤·ÖÅ䣬ÔÚʵ¼Ê¶Áд¹ý³ÌÖÐÈç¹û²»¹»ÔÙÀ©Õ¹£»
2) ¸ù¾ÝÐÒéÏûÏ¢³¤¶È´´½¨»º³åÇø¡£
ÔÚʵ¼ÊµÄÉÌÓû·¾³ÖУ¬Èç¹ûÓöµ½»ûÐÎÂëÁ÷¹¥»÷¡¢ÐÒéÏûÏ¢±àÂëÒì³£¡¢ÏûÏ¢¶ª°üµÈÎÊÌâʱ£¬¿ÉÄÜ»á½âÎöµ½Ò»¸ö³¬³¤µÄ³¤¶È×ֶΡ£±ÊÕßÔø¾Óöµ½¹ýÀàËÆÎÊÌ⣬±¨Îij¤¶È×Ö¶ÎÖµ¾¹È»ÊÇ2G¶à£¬ÓÉÓÚ´úÂëµÄÒ»¸ö·Ö֧ûÓжԳ¤¶ÈÉÏÏÞ×öÓÐЧ±£»¤£¬½á¹ûµ¼ÖÂÄÚ´æÒç³ö¡£ÏµÍ³ÖØÆôºó¼¸ÃëÄÚÔÙ´ÎÄÚ´æÒç³ö£¬ÐҺü°Ê±¶¨Î»³öÎÊÌâ¸ùÒò£¬ÏÕЩÄð³ÉÑÏÖØµÄʹʡ£
NettyÌṩÁ˱à½âÂë¿ò¼Ü£¬Òò´Ë¶ÔÓÚ½âÂ뻺³åÇøµÄÉÏÏÞ±£»¤¾ÍÏԵ÷dz£ÖØÒª¡£ÏÂÃæ£¬ÎÒÃÇ¿´ÏÂNettyÊÇÈçºÎ¶Ô»º³åÇø½øÐÐÉÏÏÞ±£»¤µÄ£º
Ê×ÏÈ£¬ÔÚÄÚ´æ·ÖÅäµÄʱºòÖ¸¶¨»º³åÇø³¤¶ÈÉÏÏÞ£º

ͼ2-35 »º³åÇø·ÖÅäÆ÷¿ÉÒÔÖ¸¶¨»º³åÇø×î´ó³¤¶È
Æä´Î£¬ÔÚ¶Ô»º³åÇø½øÐÐдÈë²Ù×÷µÄʱºò£¬Èç¹û»º³åÇøÈÝÁ¿²»×ãÐèÒªÀ©Õ¹£¬Ê×ÏȶÔ×î´óÈÝÁ¿½øÐÐÅжϣ¬Èç¹ûÀ©Õ¹ºóµÄÈÝÁ¿³¬¹ýÉÏÏÞ£¬Ôò¾Ü¾øÀ©Õ¹£º

ͼ2-35 »º³åÇøÀ©Õ¹ÉÏÏÞ±£»¤
×îºó£¬ÔÚ½âÂëµÄʱºò£¬¶ÔÏûÏ¢³¤¶È½øÐÐÅжϣ¬Èç¹û³¬¹ý×î´óÈÝÁ¿ÉÏÏÞ£¬ÔòÅ׳ö½âÂëÒì³££¬¾Ü¾ø·ÖÅäÄڴ棺

ͼ2-36 ³¬³öÈÝÁ¿ÉÏÏ޵İë°ü½âÂ룬ʧ°Ü

ͼ2-37 Å׳öTooLongFrameExceptionÒì³£
2.6. Á÷Á¿ÕûÐÎ
´ó¶àÊýµÄÉÌÓÃϵͳ¶¼Óжà¸öÍøÔª»òÕß²¿¼þ×é³É£¬ÀýÈç²ÎÓë¶ÌÐÅ»¥¶¯£¬»áÉæ¼°µ½ÊÖ»ú¡¢»ùÕ¾¡¢¶ÌÐÅÖÐÐÄ¡¢¶ÌÐÅÍø¹Ø¡¢SP/CPµÈÍøÔª¡£²»Í¬ÍøÔª»òÕß²¿¼þµÄ´¦ÀíÐÔÄܲ»Í¬¡£ÎªÁË·ÀÖ¹ÒòΪÀËÓ¿ÒµÎñ»òÕßÏÂÓÎÍøÔªÐÔÄܵ͵¼ÖÂÏÂÓÎÍøÔª±»Ñ¹¿å£¬ÓÐʱºòÐèҪϵͳÌṩÁ÷Á¿ÕûÐι¦ÄÜ¡£
ÏÂÃæÎÒÃÇÒ»Æð¿´ÏÂÁ÷Á¿ÕûÐÎ(traffic shaping)µÄ¶¨Ò壺Á÷Á¿ÕûÐΣ¨Traffic
Shaping£©ÊÇÒ»ÖÖÖ÷¶¯µ÷ÕûÁ÷Á¿Êä³öËÙÂʵĴëÊ©¡£Ò»¸öµäÐÍÓ¦ÓÃÊÇ»ùÓÚÏÂÓÎÍøÂç½áµãµÄTPÖ¸±êÀ´¿ØÖƱ¾µØÁ÷Á¿µÄÊä³ö¡£Á÷Á¿ÕûÐÎÓëÁ÷Á¿¼à¹ÜµÄÖ÷񻂿±ðÔÚÓÚ£¬Á÷Á¿ÕûÐζÔÁ÷Á¿¼à¹ÜÖÐÐèÒª¶ªÆúµÄ±¨ÎĽøÐлº´æ¡ª¡ªÍ¨³£Êǽ«ËüÃÇ·ÅÈ뻺³åÇø»ò¶ÓÁÐÄÚ£¬Ò²³ÆÁ÷Á¿ÕûÐΣ¨Traffic
Shaping£¬¼ò³ÆTS£©¡£µ±ÁîÅÆÍ°ÓÐ×ã¹»µÄÁîÅÆÊ±£¬ÔÙ¾ùÔȵÄÏòÍâ·¢ËÍÕâЩ±»»º´æµÄ±¨ÎÄ¡£Á÷Á¿ÕûÐÎÓëÁ÷Á¿¼à¹ÜµÄÁíÒ»Çø±ðÊÇ£¬ÕûÐοÉÄÜ»áÔö¼ÓÑÓ³Ù£¬¶ø¼à¹Ü¼¸ºõ²»ÒýÈë¶îÍâµÄÑÓ³Ù¡£
Á÷Á¿ÕûÐεÄÔÀíʾÒâͼÈçÏ£º

ͼ2-38 Á÷Á¿ÕûÐÎÔÀíͼ
×÷Ϊ¸ßÐÔÄܵÄNIO¿ò¼Ü£¬NettyµÄÁ÷Á¿ÕûÐÎÓÐÁ½¸ö×÷Óãº
1) ·ÀÖ¹ÓÉÓÚÉÏÏÂÓÎÍøÔªÐÔÄܲ»¾ùºâµ¼ÖÂÏÂÓÎÍøÔª±»Ñ¹¿å£¬ÒµÎñÁ÷³ÌÖжϣ»
2) ·ÀÖ¹ÓÉÓÚͨÐÅÄ£¿é½ÓÊÕÏûÏ¢¹ý¿ì£¬ºó¶ËÒµÎñÏ̴߳¦Àí²»¼°Ê±µ¼Öµġ°³ÅËÀ¡±ÎÊÌâ¡£
ÏÂÃæÎÒÃǾ;ßÌåѧϰÏÂNettyµÄÁ÷Á¿ÕûÐι¦ÄÜ¡£
2.6.1. È«¾ÖÁ÷Á¿ÕûÐÎ
È«¾ÖÁ÷Á¿ÕûÐεÄ×÷Ó÷¶Î§Êǽø³Ì¼¶µÄ£¬ÎÞÂÛÄã´´½¨Á˶àÉÙ¸öChannel£¬ËüµÄ×÷ÓÃÓòÕë¶ÔËùÓеÄChannel¡£
Óû§¿ÉÒÔͨ¹ý²ÎÊýÉèÖ㺱¨ÎĵĽÓÊÕËÙÂÊ¡¢±¨Îĵķ¢ËÍËÙÂÊ¡¢ÕûÐÎÖÜÆÚ¡£Ïà¹ØµÄ½Ó¿ÚÈçÏÂËùʾ£º

ͼ2-39 È«¾ÖÁ÷Á¿ÕûÐβÎÊýÉèÖÃ
NettyÁ÷Á¿ÕûÐεÄÔÀíÊÇ£º¶Ôÿ´Î¶ÁÈ¡µ½µÄByteBuf¿Éд×Ö½ÚÊý½øÐмÆË㣬»ñÈ¡µ±Ç°µÄ±¨ÎÄÁ÷Á¿£¬È»ºóÓëÁ÷Á¿ÕûÐÎãÐÖµ¶Ô±È¡£Èç¹ûÒѾ´ïµ½»òÕß³¬¹ýÁËãÐÖµ¡£Ôò¼ÆËãµÈ´ýʱ¼ädelay£¬½«µ±Ç°µÄByteBuf·Åµ½¶¨Ê±ÈÎÎñTaskÖлº´æ£¬Óɶ¨Ê±ÈÎÎñÏ̳߳ØÔÚÑÓ³ÙdelayÖ®ºó¼ÌÐø´¦Àí¸ÃByteBuf¡£Ïà¹Ø´úÂëÈçÏ£º

ͼ2-40 ¶¯Ì¬¼ÆË㵱ǰÁ÷Á¿
Èç¹û´ïµ½ÕûÐÎãÐÖµ£¬Ôò¶ÔнÓÊÕµÄByteBuf½øÐлº´æ£¬·ÅÈëÏ̳߳صÄÏûÏ¢¶ÓÁÐÖУ¬ÉÔºó´¦Àí£¬´úÂëÈçÏ£º

ͼ2-41 »º´æµ±Ç°µÄByteBuf
¶¨Ê±ÈÎÎñµÄÑÓʱʱ¼ä¸ù¾Ý¼ì²âÖÜÆÚTºÍÁ÷Á¿ÕûÐÎãÐÖµ¼ÆËãµÃÀ´£¬´úÂëÈçÏ£º

ͼ2-42 ¼ÆË㻺´æµÈ´ýÖÜÆÚ
ÐèÒªÖ¸³öµÄÊÇ£¬Á÷Á¿ÕûÐεÄãÐÖµlimitÔ½´ó£¬Á÷Á¿ÕûÐεľ«¶ÈÔ½¸ß£¬Á÷Á¿ÕûÐι¦ÄÜÊǿɿ¿ÐÔµÄÒ»ÖÖ±£ÕÏ£¬ËüÎÞ·¨×öµ½100%µÄ¾«È·¡£Õâ¸ö¸úºó¶ËµÄ±à½âÂëÒÔ¼°»º³åÇøµÄ´¦Àí²ßÂÔÏà¹Ø£¬´Ë´¦²»ÔÙ׸Êö¡£¸ÐÐËȤµÄÅóÓÑ¿ÉÒÔ˼¿¼Ï£¬NettyΪʲô²»×öµ½
100%µÄ¾«È·¡£
Á÷Á¿ÕûÐÎÓëÁ÷¿ØµÄ×î´óÇø±ðÔÚÓÚÁ÷¿Ø»á¾Ü¾øÏûÏ¢£¬Á÷Á¿ÕûÐβ»¾Ü¾øºÍ¶ªÆúÏûÏ¢£¬ÎÞÂÛ½ÓÊÕÁ¿¶à´ó£¬Ëü×ÜÄÜÒÔ½üËÆºã¶¨µÄËÙ¶ÈÏ·¢ÏûÏ¢£¬¸ú±äѹÆ÷µÄÔÀíºÍ¹¦ÄÜÀàËÆ¡£
2.6.2. µ¥ÌõÁ´Â·Á÷Á¿ÕûÐÎ
³ýÁËÈ«¾ÖÁ÷Á¿ÕûÐΣ¬NettyÒ²Ö§³Öµ«Á´Â·µÄÁ÷Á¿ÕûÐΣ¬Ïà¹ØµÄ½Ó¿Ú¶¨ÒåÈçÏ£º

ͼ2-43 µ¥Á´Â·Á÷Á¿ÕûÐÎ
µ¥Á´Â·Á÷Á¿ÕûÐÎÓëÈ«¾ÖÁ÷Á¿ÕûÐεÄ×î´óÇø±ð¾ÍÊÇËüÒÔµ¥¸öÁ´Â·Îª×÷ÓÃÓò£¬¿ÉÒÔ¶Ô²»Í¬µÄÁ´Â·ÉèÖò»Í¬µÄÕûÐβßÂÔ¡£
ËüµÄʵÏÖÔÀíÓëÈ«¾ÖÁ÷Á¿ÕûÐÎÀàËÆ£¬ÎÒÃDz»ÔÙ׸Êö¡£ÖµµÃ˵Ã÷µÄÊÇ£¬NettyÖ§³ÖÓû§×Ô¶¨ÒåÁ÷Á¿ÕûÐβßÂÔ£¬Í¨¹ý¼Ì³ÐAbstractTrafficShapingHandlerµÄdoAccounting·½·¨¿ÉÒÔ¶¨ÖÆÕûÐβßÂÔ¡£Ïà¹Ø½Ó¿Ú¶¨ÒåÈçÏ£º

ͼ2-44 ¶¨ÖÆÁ÷Á¿ÕûÐβßÂÔ
3. ×ܽá
¾¡¹ÜNettyÔڼܹ¹¿É¿¿ÐÔÉÏÃæÒѾ×öÁ˺ܶྫϸ»¯µÄÉè¼Æ£¬ÒÔ¼°»ùÓÚ·ÀÓùʽ±à³Ì¶Ôϵͳ½øÐÐÁË´óÁ¿¿É¿¿ÐÔ±£»¤¡£µ«ÊÇ£¬ÏµÍ³µÄ¿É¿¿ÐÔÊǸö³ÖÐøÍ¶ÈëºÍ¸Ä½øµÄ¹ý³Ì£¬²»¿ÉÄÜÔÚÒ»¸ö°æ±¾ÖÐÒ»õí¶ø¾Í£¬¿É¿¿ÐÔ¹¤×÷ÈÎÖØ¶øµÀÔ¶¡£
´ÓÒµÎñµÄ½Ç¶È¿´£¬²»Í¬µÄÐÐÒµ¡¢Ó¦Óó¡¾°¶Ô¿É¿¿ÐÔµÄÒªÇóÒ²ÊDz»Í¬µÄ£¬ÀýÈçµçÐÅÐÐÒµµÄ¿É¿¿ÐÔÒªÇóÊÇ5¸ö9£¬¶ÔÓÚÌú·µÈÌØÊâÐÐÒµ£¬¿É¿¿ÐÔÒªÇó¸ü¸ß£¬´ïµ½6¸ö9¡£¶ÔÓÚÆóÒµµÄһЩ±ßÔµITϵͳ£¬¿É¿¿ÐÔÒªÇó»áµÍЩ¡£
¿É¿¿ÐÔÊÇÒ»ÖÖͶ×Ê£¬¶ÔÓÚÆóÒµ¶øÑÔ£¬×·Ç󼫶˿ɿ¿ÐÔ¶ÔÑз¢³É±¾ÊǸö³ÁÖØµÄ°ü¸¤£¬µ«ÊÇÏà·´£¬Èç¹û²»ÖØÊÓϵͳµÄ¿É¿¿ÐÔ£¬Ò»µ©²»ÐÒÔâÓöÍøÉÏʹʣ¬ËðʧÍùÍùÒ²ÊǾªÈ˵ġ£
¶ÔÓڼܹ¹Ê¦ºÍÉè¼ÆÊ¦£¬ÈçºÎȨºâ¼Ü¹¹µÄ¿É¿¿ÐÔºÍÆäËüÌØÐԵĹØÏµ£¬ÊÇÒ»¸öºÜ´óµÄÌôÕ½¡£Í¨¹ýÑо¿ºÍѧϰNettyµÄ¿É¿¿ÐÔÉè¼Æ£¬Ò²ÐíÄܹ»¸ø´ó¼Ò´øÀ´Ò»Ð©Æôʾ¡£ |