如果想不过来,可以想1条连接的并发数、连接数
服务端同步 | 服务端异步 | |
客户端同步 |
服务端无论同步异步,效果是一样的 想象一下1条连接的情况下,服务端同一时刻只有1个req被客户端发送到并处理 1条连接在处理完并写回前,永远不会收到第2个req tcp(netty)的调用同步化(异步阻塞)及与http协议、浏览器关系 客户端同步的经典案例 线程池的取值(二)设计吞吐量【重点】 客户端强制同步模拟压测并发数 |
同 同步 https://www.jianshu.com/p/890525ff73cb 开发了一个纯异步的redis客户端 |
客户端异步 |
并发数==连接数 服务端1条连接,同一时刻只有1个事务被处理, 连接处理阻塞在处理事务而不会去读第二个req |
并发数>连接数 服务端1条连接,由于异步,可能处理多于1个的req, 甚至有可能第2个req先于第1个req处理完并写回客户端 |
用厕所坑位来举例
比如有4个小房间4个坑位,门就是连接通道
起初,门口阿姨一个一个放人进去,出来一个进去一个,这就是客户端同步,并发数最多==门(连接)数==4
过了一段时间,门口阿姨阿尔茨海默了,人没出来就放进去了,但每个房间只有一个坑,放进去的人就站在门口等,此时同时处理事务数仍然==坑位(连接)数==4;这种搞法有个问题,总有一天门被挤爆了,对于netty而言(netty 是否要开启业务线程池),要么tcp接收缓冲区窗口挤满,要么接收区直接内存爆掉;对于异步投递线程池,线程池的取值(二)设计吞吐量【重点】 / 组合设计qps【重点】 ,即是任务队列爆掉
又过了一段时间,发现小房间里面有个小门,尼玛还有个暗格,里面有个大房间可以随时随地,小房间只起一个通道的作用,大房间的人(并发)数远大于坑位(连接)数4
netty爆掉:
因为netty的链路会自己读内核,内核永远可以接收数据,tcp内核缓冲区-netty堆外缓存-堆内-handler
1)handler处理慢的话,对外内存爆掉,如上述中间那幅图
2)用业务线程,迟早如上述右边图
相关 :