【青鸟飞扬教育】事故原因猜测
当时其他指标没有检测到异常,也没有打 Dump,我们通过分析这些现象以及我们的 Dubbo 配置,猜测是在网络上发生了拥堵,而影响拥堵的关键参数就是 Dubbo 协议的连接数,我们默认使用了单个连接,但是消费者数量较少,没能充分把网络资源利用起来。
默认的情况下,每个 Dubbo 消费者与 Dubbo 提供者建立一个长连接,Dubbo 官方对此的建议是:
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
以下也是 Dubbo 官方提供的一些常见问题回答:
为什么要消费者比提供者个数多?
因 dubbo 协议采用单一长连接,假设网络为千兆网卡,根据测试经验数据每条连接最多只能压满 7MByte (不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20 个服务消费者才能压满网卡。
为什么不能传大包?
因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡,每条连接最大 7MByte (不同的环境可能不一样,供参考),单个服务提供者的 TPS (每秒处理事务数) 最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的 TPS (每秒处理事务数) 最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。
为什么采用异步单一长连接?
因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用,如果采用常规的 hessian 服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步 IO,复用线程池,防止 C10K 问题。
因为我们的消费者数量和提供者数量都不多,所以很可能是连接数不够,导致网络传输出现了瓶颈。以下我们通过详细分析 Dubbo 协议和一些实验来验证我们的猜测。