基于selector的源码分析和理解、思想和应用实践

来自京东架构师(JAVA)欢迎关注我的微信公众号java2arch,更多技术文章可看。

一个连接请求connetion request过来,产生一个通道channel(包含并封装了connection),channel注册到selector的set集合环上,服务端主线程死循环while(true)获取channel(有事件的,如枚举可读、可写、连接、连接就绪),根据事件枚举switch分支判断,通过获取的channel读请求数据、写响应数据、发送心跳回应、记录日志等等。

 

客户端与服务端建立连接获得单个channel,可以读写数据。

《基于selector的源码分析和理解、思想和应用实践》

 

精华思想:面对高并发的客户端连接和数据传输,服务端主线程不需要阻塞等待建立连接、读写数据等,通过注册通道事件驱动异步处理高并发的读写等操作。请求来了,先放到环形集合里,有读写数据了,告诉我我再来处理,在这之前,我可以干别的事情或休息,不是站着在门口干等。在进一步,主线程就是老板,来活了告诉老板,老板来了,可以分配给其他小厮做,这样效率和吞吐量就比老板一个人干要强多了吧。boss->woker模型,worker可以是线程池驱动的。netty.使用了事件驱动、异步、多线程高并发的技术和思想。另外呢,考虑引进AIO和零拷贝以及channe责任链式的处理handle和filter\chain机制,引入高效序列化、网络心跳保持防火墙开放技术、解决分包、粘包、丢包、以及安全的策略和机制。

 

    原文作者:java_arch
    原文地址: https://www.cnblogs.com/java-arch/p/10295210.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞