Dubbo 和 HTTP 到底差在哪?RPC 一定更小更快吗?连接数为什么差那么多?超时之后会不会被重复执行?这篇用 Dubbo 3.3.6(dubbo 与 tri 两种协议)和 JDK 自带的 HTTP 服务,中间放计数代理,在同一台机器上量出来。
dubbo:1 次调用共 166 / 43 字节(含建立连接),每次调用增量 334 / 86 字节;用了 1 个 TCP 连接 tri:1 次调用共 351 / 182 字节(含建立连接),每次调用增量 139 / 157 字节;用了 1 个 TCP 连接 http:1 次调用共 95 / 87 字节(含建立连接),每次调用增量 191 / 175 字节;用了 1 个 TCP 连接
小请求 dubbo 不占优势;载荷大了二进制序列化小约三成。
dubbo:每次调用增量 2836 / 2586 字节 tri:每次调用增量 2645 / 2650 字节 http:每次调用增量 3987 / 3931 字节
200 个 long + 200 字符,dubbo 2836、tri 2645、JSON 3987。
dubbo 单线程:20000 次调用,线程 1,总耗时 1865 ms,吞吐 10720 次/秒,延迟 p50 83 µs,p99 207 µs dubbo 8 线程:40000 次调用,线程 8,总耗时 1182 ms,吞吐 33826 次/秒,延迟 p50 208 µs,p99 650 µs tri 单线程:20000 次调用,线程 1,总耗时 2541 ms,吞吐 7869 次/秒,延迟 p50 113 µs,p99 289 µs tri 8 线程:40000 次调用,线程 8,总耗时 1735 ms,吞吐 23049 次/秒,延迟 p50 314 µs,p99 993 µs http 单线程:20000 次调用,线程 1,总耗时 2687 ms,吞吐 7442 次/秒,延迟 p50 124 µs,p99 253 µs http 8 线程:40000 次调用,线程 8,总耗时 2069 ms,吞吐 19332 次/秒,延迟 p50 394 µs,p99 789 µs
dubbo 协议最快,tri 与 HTTP/1.1 接近。
dubbo:TCP 连接数 1 tri:TCP 连接数 1 http:TCP 连接数 50
dubbo、tri 单连接多路复用;HTTP/1.1 并发即连接。
dubbo 默认重试:slow 失败:RpcException;服务端 slow 被执行了 3 次 dubbo retries=0:slow 失败:RpcException;服务端 slow 被执行了 1 次 tri 默认重试:slow 失败:RpcException;服务端 slow 被执行了 1 次 http:slow 失败:HttpTimeoutException;服务端 slow 被执行了 1 次
dubbo 默认超时重试 2 次,非幂等方法要关。