请教数据库请求与 rpc 之间的差异

2022-12-03 15:39:15 +08:00
 bbmike253455

背景:应用原请求方式,a->b->数据库,改成了 a->数据库,流量很大。 按道理说只是避免了 b 应用的转发逻辑,但实际上 a 应用 cpu 降了 8 个点左右,不知道是不是我带来的,所以想问 rpc 调用与直接调用数据库,有很大的差异吗?数据量大小,序列化方式什么,这些会影响 CPU 水位

1678 次点击
所在节点    程序员
9 条回复
leaves615
2022-12-03 15:50:26 +08:00
假设每个 IO 花费 20ms 时间,IO 等待在现代操作系统基本不消耗 CPU 资源。 序列化和反序列化是需要花费 CPU 资源,同样假设没错处理花费 10 个单位 CPU 占用。
a->b->数据库: 有两次 IO ,共计 40ms 时间,两次序列 /反系列操作,20 个单位占用。
a->数据库: 一次 IO ,计 20ms 时间,无序列 /反系列操作,0 个单位占用。
bbmike253455
2022-12-03 15:59:01 +08:00
@leaves615 你的计算方式是从整体上看的,b 应用 CPU 确实减少了,但是对于 a 应用来说,之前他与 b 应用发生 rpc 调用,后来与数据库,但是对于 a 来说调用次数并没有减少,只是协议发生变化,以前是 rpc ,现在数据库的
leaves615
2022-12-03 16:02:33 +08:00
a -> b -> db
a <- b <- db

a -> db
a <- db
bbmike253455
2022-12-03 16:06:48 +08:00
@leaves615 a 应用与数据库通信,也类似有序列化与反序列化的过程吧
leaves615
2022-12-03 16:17:43 +08:00
假设有,你的场景没有去掉数据库通信,在对比场景下它是恒定的。
Jooooooooo
2022-12-03 16:20:59 +08:00
rpc 本身就是耗性能的操作, 至少序列化 /反序列化就是要干活的.
lambdaq
2022-12-03 16:45:14 +08:00
说明你们 b 性能不行。
cheng6563
2022-12-03 17:35:01 +08:00
RPC 一是会增加延迟,也就是说会增加线程 /连接数等负担。二是序列化挺废性能的,尤其是你用 JSON 这类文本序列化的情况下,换用 Protocol 之类的二进制序列化方案会快很多,数据库通信应该就是用了二进制协议优化的。
Macolor21
2022-12-03 18:25:04 +08:00
IO 方面没有差异,主要是序列化的差别

- 数据库是:StringUtils.getBytes()
- 不太清楚你这边 RPC 用什么协议,JSON ? Protobuf ?

对比下这两个方法的基本上就是你这边的性能差异了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX