一文搞定Netty写数据高性能原理

简介: 一文搞定Netty写数据高性能原理

1 写数据的核心问题

image.png

1.1 写炸了

image.png

对方仓库爆仓时,送不了的时候,会停止送,协商等电话通知什么时候好了,再送。

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


1.2 挺能写的

image.png

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

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

image.png

1.3 我还能写

image.png

发送快递时,发到某个地方的快递特别多,我们会连续发,但是快递车毕竟有限,也会考虑下其他地方


Netty只要有数据要写,且能写的出去,则一直尝试,直到写不出去或满16次(writeSpinCount)

image.png

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


1.4 写不过来了

image.png

揽收太多,发送来不及时,爆仓,这个时候会出个告示牌:收不下了,最好过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开始



目录
相关文章
|
4月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
525 0
|
2月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
228 0
|
编解码 分布式计算 网络协议
Netty高性能网络框架(一)
Netty高性能网络框架(一)
|
Java 调度
Netty运行原理问题之ChannelHandler在Netty中扮演什么角色
Netty运行原理问题之ChannelHandler在Netty中扮演什么角色
122 1
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
127 1
|
编解码 网络协议 开发者
Netty运行原理问题之NettyTCP的粘包和拆包的问题如何解决
Netty运行原理问题之NettyTCP的粘包和拆包的问题如何解决
128 1
|
调度
Netty运行原理问题之事件调度工作的问题如何解决
Netty运行原理问题之事件调度工作的问题如何解决
|
消息中间件 编解码 网络协议
Netty从入门到精通:高性能网络编程的进阶之路
【11月更文挑战第17天】Netty是一个基于Java NIO(Non-blocking I/O)的高性能、异步事件驱动的网络应用框架。使用Netty,开发者可以快速、高效地开发可扩展的网络服务器和客户端程序。本文将带您从Netty的背景、业务场景、功能点、解决问题的关键、底层原理实现,到编写一个详细的Java示例,全面了解Netty,帮助您从入门到精通。
1516 0
|
开发者
Netty运行原理问题之Netty高性能实现的问题如何解决
Netty运行原理问题之Netty高性能实现的问题如何解决
|
API 开发者
Netty运行原理问题之Netty实现低开发门槛的问题如何解决
Netty运行原理问题之Netty实现低开发门槛的问题如何解决