`
vanadiumlin
  • 浏览: 514920 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)netty相关知识

 
阅读更多

哈哈,baitian 的问题问得真是。。。

要是你在公开场合问Trustin Lee,估计他会笑而不语,

嘿嘿,因为这是人家最“珍贵”的东西吗。

 

当然,我不是他,但是这问题确实很难回答,最直接的办法就是看性能测试报告,

Netty的网站上提供了几个报告了,有Trustin Lee自己的测试,还有其他人的测试,

特别是Plurk的案例,这个案例就是关注Netty能支撑多少并发链接数的(而且是长链接),

楼主的需求其实跟Plurk有点类似,请看这里: http://www.jboss.org/netty/performance.html

 

如果想知道源代码实现细节的差异,这个更难,比如你想知道Netty比Mina性能好的原因是什么,

你不光要知道Mina的所有实现细节,也同样要知道所有Netty的实现细节,

因为性能好坏是一个框架的整体表现形为,不局限于某个类、某个方法。

 

不过,为了削除某些人又怀疑我来JavaEye扯大炮了,我最好还是花1小时来码一下字,

我不了解Mina的所有实现细节,所以我只说我认为Netty做得好的地方(这些地方或许就是拉开性能差距的地方)。

 

 

NIO框架其实内部的核心实现都差不多, 比如在Server端通常开有Acceptor和Poller线程,

Acceptor负责接收请求,得到一个Socket后把它包装一下,比如放到一个Task中,然后再把Task加到一个Queue,

Poller说白了就是在不停的执行一个循环,在这个循环中处理各种Task,Task除了Acceptor新注册的任务外,当然还有读和写。

 

NIO框架性能表现得好与坏,更多的是作者在一些细节方面的处理,

比如在读写字节时尽量减少来回copy,这方面一些成熟的框架都做得很好了,

比如Tomcat、Jetty、Netty在从Socket中读取字节时一般都自已实现了一套Buffer类来对字节数组进行操作,

而不是直接使用java.nio中的Buffer类,

如果想从Buffer中抽取一个片段(比如在http协议解析中,一个请求行有method,uri,http-version),

只要把offset和片段length记下来就行了。

 

 

另一个就是并发问题了,尽量减少不必要的同步

 

比如像上面的Queue就是一个很关键的地方,这个地方一般会有三种线程在对它操作,

1. Acceptor把接收到的Socket包装成Task加到Queue(执行Queue.offer)

2. 应用线程要写数据,所以WriteTask也会加到Queue(执行Queue.offer)

3. Poller从Queue中取出Task来执行(执行Queue.poll)

 

所以这个Queue的实现就很重要了,

Netty的聪明之处在于,它没有使用java.util.concurrent中的Queue实现(比如ArrayBlockingQueue或ConcurrentLinkedQueue),

而是使用Doug Lea大神jdk1.7中才加入的jsr166y.LinkedTransferQueue

在Netty中变成了org.jboss.netty.util.internal.LinkedTransferQueue,这两个类有一点点差异,

我无法确认是Trustin Lee自己修改的,还是用了不同版本。

 

jsr166y.LinkedTransferQueue威力不容忽视,Tomcat、Jetty、Mina都没使用,

如果你刚好又用过BoneCP(一个JDBC数据库链接池框架),它也用了jsr166y.LinkedTransferQueue来对链接进行offer和poll操作,

BoneCP的测试报告出来了(http://jolbox.com/),比DBCP、C3P0快20多倍。

 

 

 

除此之外,Netty的Poller实际上就是org.jboss.netty.channel.socket.nio.NioWorker

默认情况下,NioWorker的个数是CPU个数的两倍

并且Netty在NioWorker中建立了两个LinkedTransferQueue,

一个是registerTaskQueue,另一个是writeTaskQueue

 

registerTaskQueue给Acceptor、Poller线程用,writeTaskQueue给应用线程和Poller线程用,

这一划分一定程度上减少了并发粒度,起码不用三种线程都挤到一个Queue上。

 

另一方面,writeTaskQueue是同时给多个应用线程使用的,

应用线程想往Channel中写数据时,这个Channel内部又有一个LinkedTransferQueue( 叫writeBuffer) 用来存放数据,

然后再把这个LinkedTransferQueue间接包装成一个writeTask放入writeTaskQueue,

而不是像传统做法那样每次写数据都直接放到writeTaskQueue,

 

因为Poller线程在写 应用线程A 放入的数据时,如果所有应用线程共用一个LinkedTransferQueue,

应用线程B必需跟 Poller线程 和 应用线程A 竞争同一个LinkedTransferQueue,

 

与其这样,还不如为应用线程B单独开一个LinkedTransferQueue,当Poller线程还没处理到应用B的数据时,

应用线程B自己去折腾自己的LinkedTransferQueue好了,

等Poller线程处理完应用A的数据后,再处理应用B的数据。

 

这种做法也是为了减少并发粒度,因为应用A和应用B的数据没有关联,所以没必要全放入一个Queue,

这样应用线程A和应用线程B在写数据时不会存在竞争。

 

具体实现更漂亮,有兴趣请看NioWorker和NioSocketChannel的源代码。

 

 

最后,再说一下Netty的一个缺点

大家看到这,发现我都没有提到读数据的情况,Netty读数据也是用Poller线程在读,

不管Acceptor放入多少个Socket,全是Poller线程在一个个地读,

把读到的数据放到Buffer后会触发MessageEvent事件(Netty是一个纯正的事件驱动框架,这是Tomcat、Jetty这类业余选手望尘莫及的),

此时会调用ChannelUpstreamHandler这类处理器的messageReceived方法,

messageReceived方法中的代码通常是业务相关的,但是执行messageReceived方法的线程却是Poller线程,

所以只要在messageReceived这种地方出现问题,比如有个Thead.sleep调用或者出现无限循环,

那么此时Netty跟死了没分别,Poller线程无法往下走了,所有Task都没法处理了。

分享到:
评论
2 楼 jurisp 2012-05-16  
这个缺点不是这样的吧:
如果业务逻辑比较大业务程序可以在messageReceived收到消息后交给业务自己的线程池处理的,在Boss和Worker之外有另外的BusinessProcessor;
如果业务逻辑比较小,BusinessProcessor可以使用worker的同一个线程
1 楼 javaDance 2011-12-21  
大神,我现在在做一个netty client,别的都没有问题了,现在的关键是当 client 发送数据至 server 后,server 需要有个登录回应,如果成功,client开始发送数据,问题在于这个发送的数据我设计为来源一个LinkedBlockingQueue,就像你说的,我的 handler 一直在 take这个队列,当队列中没有消息时,handler卡死,也接收不到server的别的消息,这个有什么好的思路么?我现在无奈了。。。

相关推荐

    netty框架图及netty面试知识点解析

    而Netty框架.xmind文件则可能是以思维导图的形式呈现Netty的知识结构,帮助理解和记忆各个概念之间的关系。 总之,Netty是一个强大的框架,深入学习并掌握其原理和用法,对于提升Java网络编程能力大有裨益。无论是...

    Netty重点内容总结及实战.pdf

    - 创建一个Maven工程,并添加Netty相关依赖。 - 开发服务端程序。 - 开发客户端程序。 - 对服务端和客户端进行测试。 ***ty服务端编程细节 - 创建服务启动组件ServerBootstrap。 - 创建两个线程组,一个用于...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    总的来说,《Netty实战》这本书全面覆盖了Netty的基础到高级知识,通过实例教学,使读者能够深入理解Netty的工作原理,并具备使用Netty构建高性能网络应用的能力。对于想要提升Java网络编程技能,或者已经在使用...

    Netty学习资料.zip

    最后,软件部分可能是一些与 Netty 学习相关的辅助工具,例如IDE插件、性能测试工具等,它们能帮助你在学习过程中更加高效地进行代码编写和调试。 总的来说,这个压缩包提供的学习资源全面而实用,涵盖了理论知识、...

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    Netty实战 电子版.pdf_java_netty_服务器_

    《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的...通过阅读这本书,你可以深入理解Netty的工作原理,并将这些知识应用到实际项目中,提升你的服务器开发技能。

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在帮助读者掌握Netty框架,并利用它实现即时聊天应用,同时理解其底层工作原理。Netty是Java领域的一款高性能、异步事件驱动的...

    Netty 教程 Netty权威指南

    总之,《Netty 权威指南》507页的完整版教程将深入探讨这些知识点,并通过实例帮助读者掌握如何在实际项目中运用 Netty 构建高效稳定的网络应用。通过学习,你可以深入了解 Netty 的设计理念,熟练运用其高级特性和...

    netty-netty-4.1.32.final-remark.zip

    描述中的 "tony老师netty" 可能是指一位名叫 Tony 的教师或专家,他与 Netty 相关的教学或讲解有关。这可能意味着压缩包中的内容可能是他的教学材料或者他对 Netty 的独特见解。 从标签 "netty" 我们可以确定,这个...

    netty官网学习手册中文版

    这个“netty官网学习手册中文版”针对的是Netty的3.1版本,虽然现在的Netty已经发展到了5.x版本,但3.1版本的知识仍然具有历史参考价值,特别是对于那些初次接触或需要理解Netty基础概念的开发者来说。 1. **Netty...

    netty4与spring集成

    在 Netty 和 Spring 集成的过程中,通常涉及以下几个关键知识点: 1. **Spring 上下文**: 在集成中,我们需要将 Netty 服务器配置到 Spring 的上下文中,这样可以通过 Spring 管理 Netty 的生命周期,如启动、停止...

    springboot整合netty的demo

    同时,通过`WebFluxConfig`可以定制Reactor Netty的相关配置,如连接超时、线程池大小等。 此外,为了方便测试和调试,我们可以编写启动类,通过`@SpringBootApplication`注解启动SpringBoot应用,并在其中注入并...

    最新netty中文文档chm版

    3. **搜索功能**: CHM文档支持内置的搜索功能,使得查找特定知识点更为快捷。 通过这个中文文档,你可以了解到Netty的架构设计、Channel、EventLoop、Pipeline、ByteBuf、Handler编写、线程模型、编码解码器、安全...

    Netty_中文技术文档

    ### Netty中文技术文档知识点概览 #### 一、引言与背景 在现代网络通信领域,Netty作为一款先进的网络编程框架,以其卓越的性能、稳定性和扩展性,成为了开发高并发网络应用的首选工具。传统的通用协议,如HTTP,...

    Netty实战-Netty.zip

    在深入探讨Netty的知识点之前,我们先简单理解一下什么是框架。框架是一种半成品软件,它提供了标准的结构和模式,开发者可以在其基础上进行定制化开发,以满足特定应用的需求。 Netty 的核心特性包括: 1. **异步...

    QCon SF 2015 -NormanMaurer(Netty实战作者)-Netty分享PPT

    描述部分说明了这份PPT资料对于学习者来说非常有帮助,暗示了Norman Maurer的分享内容详实且实用,能够使读者学到很多关于Netty的知识和技能。 标签为“Java Netty”,这表明分享的核心内容是围绕Netty这个高性能的...

    Netty数据转发工具

    通过阅读和学习这些文件,你可以更深入地理解Netty如何处理数据转发,并且可以将这些知识应用到实际项目中。 总的来说,Netty数据转发工具的实现涉及到对Netty框架的深入理解和灵活运用,包括服务器的启动、通道的...

    netty-4.1_javaNetty_netty_服务器_

    Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用...通过学习和实践这些知识点,你可以熟练掌握 Netty 并用其构建高性能的网络应用。在 "netty-4.1" 的文档和示例代码中,你会找到更多关于这些主题的详细信息。

    NIO+Netty5视频教程与Netty源码剖析视频教程

    该教程分为两个主要部分,分别针对理论分析和实战演练,确保学员能够从理论到实践全方位掌握相关知识。 第一部分:深入浅出Netty源码剖析 这部分教程主要讲解Netty框架的内部工作机制,包括其设计模式、事件驱动...

    netty 开源框架实用知识库分享知识分享

    Netty 开源框架实用知识库分享知识分享 Netty 是一个高性能、异步的网络编程框架,可以快速地开发高性能的网络应用程序 本文档将详细介绍 Netty 的核心概念、实现原理和实践应用,旨在帮助开发者快速掌握 Netty 的...

Global site tag (gtag.js) - Google Analytics