《Netty 高性能网络编程》3.2 任务队列与定时任务
本节把 EventLoop 当作单线程调度器来用:execute、schedule、scheduleAtFixedRate 的提交与执行顺序,ChannelFuture 回调里如何安排重连退避,GlobalEventExecutor 与 DefaultEventExecutorGroup 各自适合什么,以及心跳任务写成定时器后为什么会静默停止。给出阻塞任务推迟定时器的本机输出。
tag
本节把 EventLoop 当作单线程调度器来用:execute、schedule、scheduleAtFixedRate 的提交与执行顺序,ChannelFuture 回调里如何安排重连退避,GlobalEventExecutor 与 DefaultEventExecutorGroup 各自适合什么,以及心跳任务写成定时器后为什么会静默停止。给出阻塞任务推迟定时器的本机输出。
本节回答 linkd-v2 上线前的三个问题:boss 与 worker 各开多少线程、一个 Channel 为什么终身只属于一个 EventLoop、group.next() 如何分配连接。用探针打印 channel.eventLoop() 与线程名,给出 10 核机器的真实分配、io.netty.eventLoopThreads 的效果,以及多连接共享 EventLoop 的延迟代价。
ChannelOption 是强类型常量,作用在监听或连接 channel 上。本节拆开 SO_BACKLOG、TCP_NODELAY、SO_KEEPALIVE、CONNECT_TIMEOUT_MILLIS、ALLOCATOR、RCVBUF_ALLOCATOR、WRITE_BUFFER_WATER_MARK 与 AUTO_READ,给出 linkd-v2 参数表和打印 config 的方法。
Channel 从注册到注销经历 registered、active、read、inactive、unregistered 五个阶段,ChannelFuture 串起异步结果与监听器。用 linkd-v2 LifecycleLoggingHandler 与 RegistryHandler 演示事件顺序、closeFuture 关闭、CLOSE 监听器和连接失败处理,说明 sync() 死锁边界。
ServerBootstrap 与 Bootstrap 是两条启动路径:一条接受连接,一条发起连接。拆开 group、childHandler、option、childOption、bind 与 connect 的分工,说明 boss/worker 职责和 ChannelInitializer 每连接执行一次的语义,给出 linkd-v2 LinkdServer 启动与 sync() 线程边界。
本节搭 linkd-v2 四模块 Maven 工程:父 POM 固定 netty.version=4.2.19.Final 与 maven.compiler.release=25,模块保持单向依赖,入口 LinkdV2Main 用 System.Logger 打印协议常量,并给出 mvn -q -DskipTests package 的构建结果与 netty-all 聚合 POM 的验证方法。
本节把卷一 linkd 的 EventLoop、Connection、Handler、BufferPool、FrameDecoder 逐个映射到 Netty 的 EventLoopGroup、Channel、Pipeline、ByteBufAllocator、ByteToMessageDecoder,用对照表和最小 Echo 说明哪些手写逻辑被 Netty 接管,哪些责任仍留在业务代码里。
本节把 Netty 放回一次真实请求的路径里:从 JDK NIO 的 Selector 到 HTTP 协议处理,说明它封装了事件分发、半包与写队列,没封装路由、认证和业务语义;并对比 Tomcat、Jetty、OkHttp 的层次差异,给出 linkd-v2 的四模块划分与 9090 到 9093 的端口分工。
《Netty 高性能网络编程》全书导航:给出协议实现、性能排查、生产网关三条学习路径,十五章分组表与每章首节入口,linkd-v2 四个模块的推进与验收状态,以及 50 篇的阅读顺序、依赖关系、每组能力的自测检查点和附录入口,方便按目标跳读。
交代本书的读者对象与前置知识,列出 Temurin 25.0.5+8、Maven 3.9.12、Netty 4.2.19.Final 的环境清单和 Apple M1 Pro 机器口径,说明 linkd-v2 的四道门禁、端口 9090/9091/9092/9093、代码与输出约定,以及每节内容的验证步骤和常见误解。
从卷一手写 NIO 的 linkd 留下的四个缺口切入,说明为什么还要学 Netty:给出 EventLoop、Channel、Pipeline、ByteBuf 与手写结构的对应关系,交代三卷本定位、Netty 4.2.19.Final 与 JDK 25 的版本口径,以及全书主线 linkd-v2 的验收产出。
《Java 网络编程基础》全 50 篇,只用 JDK 原生 Socket 与 NIO,从一次 HTTP 请求的路径讲到 TCP/UDP、拆帧、Buffer、Selector 与 Reactor,再手写 HTTP/1.1、HTTP/2、TLS 与 WebSocket,最后落到线程模型、零拷贝、背压、抓包压测与 v1 验收:15 章 45 节加前置与附录的完整索引。
《Java 网络编程基础》附录 B:macOS 26.3 上可直接复制的网络诊断命令,覆盖 netstat -anv -p tcp、lsof -nP -iTCP:9090、sudo tcpdump -i lo0、nc、curl -v、ab、jcmd Thread.print 与 VM.native_memory,每条给用途、关键列读法与常见误判。
《Java 网络编程基础》附录 A:把 InetAddress、Socket、ServerSocket、SocketChannel、ServerSocketChannel、Selector、ByteBuffer、FileChannel 八组 API 压成速查表,逐条给签名、作用、易错点与最小示例,按 JDK 25 核对,并附 linkd 类映射与异常对照表。
v1 能跑通不等于能交付。本节把前 14 章收成一张 linkd v1 验收清单:健康检查、keep-alive、HTTP/2 preface、WebSocket 升级、TLS、优雅关闭逐条给命令与判据,再用 AcceptanceChecklist 自动跑可自动化的部分,最后给出故障注入项与复盘模板,形成可复现的发布记录。
ab 能跑出数字,但吞吐、p50/p95/p99、错误数和连接数必须一起读,单看 QPS 会得出相反结论。本节确认本机 ab 可用、wrk 不在,用三次 keep-alive 与一次非 keep-alive 实测 /healthz,给出 LoadTestPlan 的 Little 定律并发估算、分位算法与验收判定。
连接卡住时线程栈只说它在等,netstat 才说等到哪一步。本节用 macOS 的 netstat -anv -p tcp、lsof -nP -iTCP 实测 CLOSE_WAIT、TIME_WAIT、SYN_SENT 三种状态,讲 sudo tcpdump -i lo0 的读法与权限边界,把 linkd 的 ConnectionDiagnostics 接进排查链并给出误判边界。
停掉 accept 不等于优雅关闭:写队列没排空就退出,客户端会看到响应被截断。本节用 linkd 的 GracefulShutdown 接住 SIGINT,停止接收新连接、按连接半关闭、在期限内排空,超时后强制关闭,并给出可复现的阶段输出。
连接超时、读超时和请求期限常被混成一个数字,重试又会把一次失败放大成多倍流量。本节用 linkd 的 RetryPolicy 区分失败阶段、计算带抖动的退避、约束总期限,并在 libraryd 上游调用中给出幂等键复用与只对安全操作重试的判断表。
写队列只设一个阈值,暂停与恢复会在事件循环里反复抖动。本节用 linkd 的 WatermarkHandler 实现高低水位滞回、写队列硬上限、暂停与恢复 OP_READ、令牌桶读限速和帧边界丢弃,并给出可复现的水位迁移、令牌桶配额与硬上限关闭输出。