Netty是如何写数据的?

简介: Netty是如何写数据的?

1 写数据的核心问题

image.png

1.1 写炸了

  • 对方仓库爆仓时,送不了的时候,会停止送,协商等电话通知什么时候好了,再送。
    Netty写数据,写不进去时,会停止写,然后注册一个 OP_WRITE事件,来通知什么时候可以写进去了再写。

1.2 挺能写的

  • 发送快递时,对方仓库都直接收下,这个时候再发送快递时,可以尝试发送更多的快递试试,这样效果更好。


Netty批量写数据时,如果尝试写的都写进去了,接下来会尝试写更多(调整maxBytesPerGatheringWrite)

image.png

1.3 我还能写

  • 发送快递时,发到某个地方的快递特别多,我们会连续发,但是快递车毕竟有限,也会考虑下其他地方
  • Netty只要有数据要写,且能写的出去,则一直尝试,直到写不出去或满16次(writeSpinCount)

image.png

写16次还没有写完,就直接 schedule 一个 task 来继续写,而不是用注册写事件来触发,更简洁有力。

1.4 写不过来了

  • 揽收太多,发送来不及时,爆仓,这个时候会出个告示牌:收不下了,最好过2天再来邮寄吧。
  • Netty待写数据太多,超过一定的水位线(writeBufferWaterMark.high()) ,会将可写的标志位改成 false,让应用端自己做决定要不要发送数据(写)了(很真实,将责任推给用户)。

image.png

2 核心流程

1.jpg

  • Write - 写数据到buffer :

ChannelOutboundBuffer#addMessage

image.png

  • Flush -发送buffer里面的数据:

AbstractChannel.AbstractUnsafe#flush

  • 准备数据: ChannelOutboundBuffer#addFlush

image.png

  • 写完了更新状态

image.png

  • 发送: NioSocketChannel#doWrite

image.png

3 写数据的根本

  • Single write

sun.nio.ch.SocketChannelmpl#write(java.nio.ByteBuffer)

  • gathering write(批量写)

sun.nio.ch.SocketChannelmpl#write(java.nio.ByteBuffer[], int, int)


写数据写不进去时,会停止写,注册一个 OP_WRITE 事件,来通知什么时候可以写进去了。

OP_WRITE不代表有数据可写,而是可以写进去,所以正常情况下不要注册它,否则会一直触发。


  • channelHandlerContext.channel().write()
    从TailContext开始执行
  • channelHandlerContext.write()
    从当前的Context开始
目录
相关文章
|
Java API 容器
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf
460 0
【Netty 网络通信】传统IO方式处理网络IO数据
【1月更文挑战第9天】【Netty 网络通信】传统IO方式处理网络IO数据
|
编解码 Java 应用服务中间件
“超越极限 - 如何使用 Netty 高效处理大型数据?“ - 掌握 Netty 技巧,轻松应对海量数据处理!
本文介绍了Netty中大型数据写入与序列化技术的实现方法。在大型数据写入方面,通过FileRegion接口和零拷贝技术优化文件传输效率,避免内存耗尽风险。同时,ChunkedWriteHandler支持异步写入大型数据流,减少内存消耗。关于序列化,文章探讨了JDK标准序列化、JBoss Marshalling及Google Protocol Buffers三种方式,分别适用于不同场景需求。最后总结指出,Netty提供的编解码器和ChannelHandler组件经过实践验证,具备高度灵活性与稳定性,可广泛应用于各类系统开发中。
703 0
“超越极限 - 如何使用 Netty 高效处理大型数据?“ - 掌握 Netty 技巧,轻松应对海量数据处理!
|
API 容器
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf(一)
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf
291 0
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf(一)
|
JSON 移动开发 网络协议
数据拆散与黏连:深入剖析Netty中的半包与粘包问题
数据拆散与黏连:深入剖析Netty中的半包与粘包问题
543 0
|
Java API
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf(二)
《跟闪电侠学Netty》阅读笔记 - 数据载体ByteBuf
378 0
Netty(三)之数据之粘包拆包
Netty(三)之数据之粘包拆包
258 0
Netty(三)之数据之粘包拆包
|
分布式计算 网络协议 前端开发
【Netty底层数据交互源码】
【Netty底层数据交互源码】
337 0
|
编解码 安全 前端开发
在netty中使用protobuf并实现数据加密传输
在netty中使用protobuf并实现数据加密传输
814 0
在netty中使用protobuf并实现数据加密传输
netty案例,netty4.1基础入门篇九《自定义编码解码器,处理半包、粘包数据》
在实际应用场景里,只要是支持sokcet通信的都可以和Netty交互,比如中继器、下位机、PLC等。这些场景下就非常需要自定义编码解码器,来处理字节码传输,并控制半包、粘包以及安全问题。那么本章节我们通过实现ByteToMessageDecoder、MessageToByteEncoder来实现我们的需求。
424 0
netty案例,netty4.1基础入门篇九《自定义编码解码器,处理半包、粘包数据》