哈喽!大家好,我是小奇,一位热爱分享的程序员

小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧

文章持续更新

一、前言

书接上回,现在下着大雨看来是去不了镇上买熟食吃了,但是在家待着也没有意思,去找我表弟玩吧,看看他在家干啥呢?

表弟家离我家很近,走一条街再拐几个弯就到了,大中午的应该在家刚做完饭,正好蹭饭。

正要推开门发现门里面锁着呢,这大白天的锁着门干啥呢,敲了敲门。

我:有人在家吗?

表弟:谁呀?

我:我,你哥。

表弟:哦,那没有人在家,你回吧!

我:赶紧给我开门,别墨迹。

我说怎么这小子不开门,躲家里啃鸡腿呢,就怕我饭点来。

表弟:哥你咋来了?

我:咋?我还不能来啊!

表弟:你不是去北京找工作去了吗,怎么这么快就回来了。

我:别提了,现在工作不好找。

表弟:那不行你就回来跟我一起养猪吧,我老是出去卖猪肉,家里猪下崽了我也不能及时发现,你在家就能给我看着了。

我:现在哪里还用人看着猪圈啊,都是摄像头了。

表弟:啥是摄像头呢,去哪里找呢?

我:走,我带你去村里看看墙上刚打的广告。

表弟:说的真对,我现在就买一个。

我:你买吧,我回家做饭去了,你这就一个鸡腿还让你啃成这样子了,我走了。

回到家中做一个大米汤吧,炒一个蒜苔鸡蛋,正炒着菜呢电话响了。

我:“喂您好”。

对面:“您好,请问是小奇吗”。

我:“是我,你是?”。

对面:“我是XXX公司的,我看到hr推给我你的简历,我感觉还不错,你什么时候方便来现场面试一下”。

我:“现在不方便现场面试了”。

对面:“好吧,那你现在方便吗?我们现在线上面试一下吧”。

我:“好的”。

二、面试

面试官:我看你简历上写的精通Netty,那你能简单说一下Netty是什么吗?

我:Netty首先是一个java开源框架,他是一个提供了异步的、基于事件驱动的网络应用程序框架,所以说Netty就是一个网络应用框架,可以开发出高性能、高可靠的网络服务器和客户端程序。

面试官:嗯。那Netty为什么能够开发出高性能、高可靠的网络服务器呢,他为什么速度这么快呢?

我:这得益于Netty的线程模型的架构设计,使得Netty可以基于NIO的设计理念对线程模型基于改进,使得Netty在处理客户端请求连接,和客户端请求数据处理的时候可以快速的进行处理。

面试官:嗯。你能跟我分析一下Netty的线程模型吗?

我:Netty模型中首先有这些属性概念。

BossGroup:相当于一个事件循环线程池,这个池中有多个事件循环线程。这个线程池是专门处理客户端的连接事件的。

WorkerGroup:也是一个事件循环线程池,这个线程池是专门处理客户端的读写请求事件的。

NioEventLoop:这个就是事件循环线程,每一个事件循环线程都有一个selector用来监听事件。

NioSocketChannel:这个是在客户端与BossGroup中的一个事件循环线程建立连接后生成的,将这个可以注册到WorkerGroup的一个事件循环线程上,让WorkerGroup的事件线程来处理后续的读写请求。

Pipeline:这个处理从WorkerGroup过来的数据,他包含很多ChannelHandler,这些是真正处理数据的。

ChannelHandler:真正用来处理数据的。

面试官:嗯。可以讲一下从客户端连接到发送数据的整个流程吗?

1、客户端向BossGroup发起连接请求,BossGroup中的NioEventLoop处理了连接请求后生成一个NioSocketChannel。

2、BossGroup将NioSocketChannel注册到WorkerGroup中的一个NioEventLoop中的一个Selector上。至此BossGroup的工作完成,他接着处理其他客户端的连接请求。

3、WorkerGroup循环监听注册在自己的Selector上的这些NioSocketChannel有没有读写的事件发生。

4、WorkerGroup监听到NioSocketChannel有读写事件发生就交给Pipeline处理。至此WorkerGroup工作完成,他继续处理其他客户端的读写事件。

5、Pipeline接收到WorkerGroup发送过来的数据,然后交给ChannelHandler进行处理。

面试官:嗯。那Netty为什么比传统的网络编程工具更加快呢?

我:因为Netty将客户端的连接请求和读写数据的请求分开用两个线程池来处理,这样大大提高了效率。

面试官:“小伙子不错呀,什么时候能回北京入职呢”

我:“额。。。等等吧,现在家里雨太大了,容易弄一身巧克力。”

面试官:“行,那你来了北京一定来我们公司上班啊”

我:“额。。。这个跟你承诺不了,万一还有别的好公司给我打电话呢”。

面试官:“来吧,条件好商量”

我:“我考虑考虑吧”。

三、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧

Netty是什么,Netty为什么速度这么快,线程模型分析的更多相关文章

  1. netty源码解解析(4.0)-4 线程模型-概览

    netty线程体系概览 netty的高并发能力很大程度上由它的线程模型决定的,netty定义了两种类型的线程: I/O线程: EventLoop, EventLoopGroup.一个EventLoop ...

  2. netty reactor线程模型分析

    netty4线程模型 ServerBootstrap http示例 // Configure the server. EventLoopGroup bossGroup = new EpollEvent ...

  3. netty源码解解析(4.0)-7 线程模型-IO线程EventLoopGroup和NIO实现(二)

    把NIO事件转换成对channel unsafe的调用或NioTask的调用 processSelectedKeys()方法是处理NIO事件的入口: private void processSelec ...

  4. netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)

    接口定义 io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel ...

  5. netty源码解解析(4.0)-5 线程模型-EventExecutorGroup框架

    上一章讲了EventExecutorGroup的整体结构和原理,这一章我们来探究一下它的具体实现. EventExecutorGroup和EventExecutor接口 io.netty.util.c ...

  6. Netty In Action中文版 - 第十五章:选择正确的线程模型

    http://blog.csdn.net/abc_key/article/details/38419469 本章介绍 线程模型(thread-model) 事件循环(EventLoop) 并发(Con ...

  7. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  8. [Netty 1] 初识Netty

    1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架. Netty项目地址:htt ...

  9. Netty高性能之Reactor线程模型

    Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用 ...

随机推荐

  1. 深入理解ES6之《用模块封装代码》

    什么是模块 模块是自动运行在严格模式下并且没有办法退出运行的Javascript代码 在模块的顶部this的值是undefined 其模块不支持html风格的代码注释除非用default关键字,否则不 ...

  2. Chrome 已经原生支持截图功能,还可以给节点截图!

    昨天 Chrome62 稳定版释出,除了常规修复各种安全问题外,还增加很多功能上的支持,比如说今天要介绍的强大的截图功能. 直接截图 打开开发者工具页面,选择左上角的元素选择按钮(Inspect) W ...

  3. electron制作聊天界面(仿制qq)

    效果图: 样式使用scss和flex布局 这也是制作IM系统的最后一个界面了!在制作之前参考了qq和千牛 需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的 滚动条美化 ::-webk ...

  4. ES6-11学习笔记--Promise

    Promise是ES6异步编程解决方案之一,简化以前ajax的嵌套地狱,增加代码可读性.   基本用法: resolve,成功 reject,失败 let p = new Promise((resol ...

  5. Python窗口学习之搜索框美化

    初学tkinter,感觉这个插件虽然是做界面的,但是没有html,也没有android那么人性化 既没有画圆角长方形的办法也没有添加透明按钮的办法(可能是我没找到) 所以自己用canvas画了两个扇形 ...

  6. Android Studio 异常以及解决方案

    1. Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVER ...

  7. 微信h5静默和非静默授权获取用户openId和用户信息的方法和步骤:

    原文链接:https://blog.csdn.net/qq_35430000/article/details/79299529 一.openId是什么?openId是用户在当前公众号下的唯一标识('身 ...

  8. Javascript中数组的判断方法

    摘要: 1.数组检测的方法: 1) typeof . 2) instanceof . 3) constructor . 4) Object.prototype.toString. 5) Array.i ...

  9. python---重建二叉树

    """ 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5, ...

  10. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...