ARTICLE · 1114107
Tomcat9源码剖析(四):落地到网络编程实战
Tomcat9源码剖析(四):落地到网络编程实战
Tomcat9源码剖析(四):落地到网络编程实战
原理都懂,一写 NIO 服务端还是栽。Tomcat 跑过二十多年,踩过的坑全留在代码里了。
TCP 是流不是消息,数据可能分一百段来。它用个 phase 字段做状态机,断在哪就从哪续,绝不重扫字节。更狠的是事件所有权。Poller 派活前得先摘掉读兴趣位,干完再挂回去。不然两个线程同时读写同一个 channel,直接数据错乱。
阻塞和非阻塞也得划清界限。我用个原子变量兼做计数和判断,决定走立刻 select 还是带超时的。IO 线程只管分发,业务全扔给工作线程,免得卡住整个连接器。
超时管理不能每轮傻查。我记下最早超时时间,没到点就省掉这步。算出的超时派发下去前还得再核一次状态,防着异步请求刚好完成被误杀。粘包也一样,处理完一个请求必须立刻接着跑下一个,不然缓冲区一回收,后面的数据就凭空消失了。
这些坑都在处理状态和时间的错位。最难排查的就是没摘兴趣位那条,并发上来才暴露,修法却只有一行代码。
原文Tomcat 9 源码剖析(四):落地到网络编程的实战能力
河南,1小时前,