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

2024-10-17 08:24:57 +08:00
 gibber
比如 a 服务需要从 b 服务获取几十万的数据处理后生成自己的业务数据,如果 b 服务直接从数据库中一次性查出来返回,对内存的压力就很大。
现在的方案是使用分页,每次最多 1 万条记录,获取一批处理一批,把整个业务处理的时间拉长了。
想知道还有没有更好的办法
5487 次点击
所在节点    Java
46 条回复
cccssss
2024-10-17 11:00:47 +08:00
直接读 b 库
不让读的话只能说又想马儿跑又不给马儿吃草
InkAndBanner
2024-10-17 11:13:35 +08:00
oss or 离线数仓,如果在线去拉的话 就算可行,ab 服务的 io 会不会被占满导致其他接口、服务不可用?
bthulu
2024-10-17 11:20:56 +08:00
获取一批处理一批, 怎么就把业务处理时间拉长了?
你一次获取, 不还是要处理这么多?
newaccount
2024-10-17 11:21:51 +08:00
要么时间换空间,要么空间换时间
你这又嫌内存占用大又嫌处理时间长的
就算让 a 直接读 b 库,那内存占用无非是从 b 服务器转移到 a 服务器
masterclock
2024-10-17 11:29:21 +08:00
看看能不能让 a 不依赖 b ,数据分别进 a 、b 服务
如果 a 强依赖 b ,那就别微服务了,把 a 整合进 b ,或者 a 的这一部分功能整合到 b
kchenzhi
2024-10-17 12:19:18 +08:00
这事我有经验。
1 、不要在 responseBody 里返回, 那样内存一定会爆。
2 、不要分页查询,两个原因:①不同分页的查询不在一个事务中,会有数据一致性的问题。②当查询到靠后的分页时,耗时直线上升,性能太差。
kchenzhi
2024-10-17 12:21:50 +08:00
3 、如果能让 a 直接读库,那是一种解决方案。但如果 b 里有些处理逻辑比较复杂,那你得在 a 中重新实现一遍,重复工作量且代码冗余,不合适。

我们最终采取的方案是:访问数据源时使用游标,一行行读取数据后,通过 http outputstream ,用流式返回。
R4rvZ6agNVWr56V0
2024-10-17 13:03:27 +08:00
时间换空间:小批次分批执行
空间换时间:增加内存,大批量执行
中间方案:放在共享存储(例如 nfs ),mmap 读文件,增加消费者进程消费
clf
2024-10-17 13:09:41 +08:00
数据表做数据冗余吧。
gibber
2024-10-17 14:08:39 +08:00
@xiaohupro 就是一次查询改为多次查询后比较耗时,不太想引入额外的中间件来处理
gibber
2024-10-17 14:18:22 +08:00
@kchenzhi a 服务本地数据源的话是会使用流式查询的,倒是不清楚微服务调用也能使用流式处理的方式,感觉可以参考,谢谢
molicloud
2024-10-17 15:29:55 +08:00
直接在 b 服务处理数据,再通知或调用 a 服务
vacuitym
2024-10-17 15:37:22 +08:00
定时生成文件给下载地址(这感觉很像对账单)
asAnotherJack
2024-10-17 15:38:08 +08:00
@kchenzhi #26 `当查询到靠后的分页时,耗时直线上升,性能太差。`
盲猜是不是用的 limit offset 做的分页
gibber
2024-10-17 15:59:26 +08:00
@molicloud b 服务只负责从数据库查询数据,不处理具体业务
notwaste
2024-10-17 16:22:40 +08:00
b 服务查出来往 kafka 里面丢,a 服务消费处理
macttt
2024-10-17 16:38:54 +08:00
A 服务提交一个任务给 B 服务,B 服务收到任务后推送数据给 A 服务。两个服务之间的数据完备性检查,你可以使用类似于 TCP 传输的形式。A 服务不用管 B 服务怎么实现的,只需要接收数据就行了,B 服务则需要让 A 服务记录数据完整性的元数据。
snickers
2024-10-17 17:13:12 +08:00
不建议走接口 ,ETL 转换调度
molicloud
2024-10-17 18:56:18 +08:00
@gibber #35 在新建一个 b-analysis 服务,也连和 b 相同的数据库
siweipancc
2024-10-19 16:41:14 +08:00
不要分页,用游标依次写到队列里

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

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

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

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

© 2021 V2EX