微服务的同步异步(二)一个线程多个请求与一个连接多个请求(http2),客户端的多路复用
1
一个线程多个请求
http1.1+epoll
2
一个连接多个请求(http2)
HTTP/2 的多路复用(multiplexing)解决的是「单 TCP 连接上多个请求/响应交错传输」
http2是应用层协议,可以跑阻塞IO,也可以多路复用
HTTP/2 在一个连接上做到了并发(多个流交错传输,宏观同时)
HTTP/2 在同一个 TCP 连接上,通过二进制分帧和流 ID,实现了逻辑上的多路并发。数据在线上还是串行发送的,但接收方可以根据帧头里的流 ID,把数据重新组装成多个独立、并行的请求/响应**。像传输层的TCP,缓存、顺序、重组-》业务消费
效果:客户端可以在同一个连接上同时发送流1(第1个请求)、流3(第2个请求)、流5(第3个请求)…… 服务端也可以同时返回流1的响应、流3的响应、流5的响应,互不阻塞。
HTTP/1.1 为什么做不到这种并发?
因为它的模型是请求-响应串行:发出请求1后,必须收到完整的响应1,才能发请求2。无法在中间穿插请求2的数据。
3


4 grpc写入内核缓冲时,会不会拆包乱序----连接channel.write有队列?
假如写入阻塞时,操作系统唤醒会不会乱序
比如A写3个字节满了阻塞,B直接阻塞;tcp滑动窗口移动,操作系统唤醒谁?是公平锁吗
5
异步客户端本身不会阻塞任何线程(它的 IO 线程是非阻塞的)。你的业务线程是否阻塞,完全取决于你是否主动调用阻塞方法(如 Future.get()、CountDownLatch.await() 等)去等待结果。真正用好异步,就要学会“回调接力”,让业务线程也像 IO 线程一样,永不等待。
浙公网安备 33010602011771号