请教下微服务间大批量数据获取一般是如何处理的

2024-10-17 08:24:57 +08:00
 gibber
比如 a 服务需要从 b 服务获取几十万的数据处理后生成自己的业务数据,如果 b 服务直接从数据库中一次性查出来返回,对内存的压力就很大。
现在的方案是使用分页,每次最多 1 万条记录,获取一批处理一批,把整个业务处理的时间拉长了。
想知道还有没有更好的办法
5487 次点击
所在节点    Java
46 条回复
kchenzhi
2024-10-22 12:00:50 +08:00
@asAnotherJack
请问是这种方式吗:LIMIT row_count OFFSET offset
我们就是用这种, 仍然是直线上升哦,
每页 5000 行,翻到 1000 页后,对比起第一页的查询速度已经差了好几个数量级了。

请问是有什么优化技巧我没用上么?
asAnotherJack
2024-10-22 14:20:58 +08:00
@kchenzhi #41 用 lastId + pageSize 的方式,where id > lastId order by id limit pageSize
kchenzhi
2024-10-23 10:38:37 +08:00
@asAnotherJack 这个方案我们也用过, 可以是可以,但是有两个问题:
1 、对调用方有了一些入侵。
2 、多分页拉取的数据可能会跨事务,导致数据一致性被破坏。

所以最后选择的是游标查询加流式传输,一次查询解决问题。
suolong00
2024-10-24 09:32:07 +08:00
没人说用消息中间件吗,b 服务器使用多线程查询几十万的数据,写到消息队列中,a 去消费就行了,可以多线程插入
gibber
2024-10-24 13:04:54 +08:00
@suolong00 主要不想为这一个功能去引入一个中间件
Plutooo
2024-11-06 16:57:26 +08:00
@kchenzhi 你好,可以请教一下 http outputstream 流式返回主要是通过什么实现吗,是 rpc 有类似的实现么

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

https://ex.noerr.eu.org/t/1081015

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

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

© 2021 V2EX