2024年最全阿里二面:NIO为什么不适合文件上传场景、如何优雅解决(1),教你如何增加拿到BAT大厂offer几率

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

2、IO读事件从处理流程


IO读事件由AbstractNioByteChannel内部类AbstractNioUnsafe的read方法实现,接下来重点剖析该方法,从中窥探Netty对IO读事件的处理。

在这里插入图片描述

Step1:如果没有开启自动注册读事件,在每一次读时间处理过后会取消读事件,默认为自动注册。

温馨提示:如果通道不注册读事件,将无法从通道中读取数据,即无法处理请求或接受响应。

如果没有开启自动读事件,需要应用程序在需要的时候手动调用通道的read方法。

取消读事件,Netty基于NIO给出了非常标准的实现,基本可以当场模板代码使用:

在这里插入图片描述

其实现关键点:首先判断键值对是否有效,然后通过位运算进行取消注册。

在这里插入图片描述

Step2:创建接受缓存区内存分配器,这里有两个关键点:

  • maxMessagesPerRead

每一个通道在一次读事件处理过程中最多可以调用底层Socket进行读取的次数,默认为16次,这里的设计哲学是避免一个通道需要读取太多的数据,从而影响其他通道的数据读,因为在一个事件选择器中多个通道的读事件是串行执行的

  • RecvByteBufAllocator

接受缓冲区的内存分配策略,分为分配固定大小(不够时扩容)、动态变化(根据历史分配的大小,动态条件合适的内存大小),这里主要的设计哲学是合理利用内存,并减少扩容,提高内存的分配效率与使用效率

在这里插入图片描述

Step3:循环处理读事件,最多处理maxMessagePerRead。接下来探讨一下单次读事件的处理流程。

在这里插入图片描述

Step4:进行一次IO读处理,其处理有如下几个关键点:

  • 首先分配一个ByteBuf,俗称接收缓存区,用来存放从网络中读取的内容。

  • 获取一下分配到的累积缓存区可写的字节数,这个后面有妙用

  • 调用底层网络读API从网卡中读取数据,NIO的读取实现如下所示:

在这里插入图片描述

即调用NIO中的SocketChannel进行读数据,其返回参数表示这次从网卡中读取到的字节数。如果读取到的字节少于0,则表示对端通道已关闭,己端也需要进行相应的处理,例如关闭通道

  • 读到一批数据后,会通过事件传播机制向事件链中传播channelRead事件,触发后续对该批数据的处理。

在这里插入图片描述

Step5:判断该通道是否需要继续读,其基本依据如下:

  • 如果未开启自动注册读事件,读完一次之后将不再继续读取。

  • 如果本次读取到的字节数小于接收缓存区,说明此刻网卡中没有可读数据,等下一次读事件触发再继续读。

在这里插入图片描述

Step6:一次或多次读操作结束后,会触发一次读完成事件,向整个事件链传播。

整个网络读处理流程就介绍到这了。

3、接受连接处理流程


在Netty中,服务端接收客户端的连接请求(OP_ACCEPT),被封装在channelRead 事件中,其代码入口为:AbstractNioMessageChannel 的内部类NioMessageUnsafe的read方法。

在这里插入图片描述

其大概的实现要点在前面已经介绍,这里主要看一下NioServerSocketChannel的doReadMessage。

在这里插入图片描述

通过使用底层的NIO接受一个连接,并获取NioSocketChannel对象。然后继续该对象向下传播channelRead事件,在后续的处理器中对该对象进行操作,例如将其注册读事件,从而触发网络的读操作,关于NioSocketChannel如何绑定读事件、注册业务相关的事件监听器机制已经在Netty进阶:手把手教你如何编写一个NIO服务端中详细介绍,本文就不再重复。

好了,本文就介绍到这里了,想必对开头部门提出的问题有了自己的答案了吧,您的一键三连是对我最大的鼓励,当然可以加笔者微信:dingwpmz,备注CSDN,共同交流探讨。

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值