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

2024-10-17 08:24:57 +08:00
 gibber
比如 a 服务需要从 b 服务获取几十万的数据处理后生成自己的业务数据,如果 b 服务直接从数据库中一次性查出来返回,对内存的压力就很大。
现在的方案是使用分页,每次最多 1 万条记录,获取一批处理一批,把整个业务处理的时间拉长了。
想知道还有没有更好的办法
5487 次点击
所在节点    Java
46 条回复
ZGame
2024-10-17 08:28:05 +08:00
1.内存压力大?一个作业才几十万数据。。 如果怕影响 a 库业务性能,直接给 a 库做一个从库,从从库里拉数据。
2.走 cdc 那种从日志里读取,这种时效性会好点。我是感觉没必要
csys
2024-10-17 08:29:35 +08:00
1.
b 服务把数据保存成文件
a 服务下载文件后进行处理

2. kafka/cdc
securityCoding
2024-10-17 08:29:41 +08:00
单独落离线表,明令禁止直接从线上业务表捞数据
ymz
2024-10-17 08:36:53 +08:00
kafka
m2276699
2024-10-17 08:46:01 +08:00
数据源之间冗余
xiaohupro
2024-10-17 08:46:27 +08:00
时间线拉长应该是由于同步导致的吧,查一万处理一万。可以把查处来的数据立马丢给 Kafka 或者 Rabbit MQ 这类消息队列,A 服务监听队列,只要有数据就一直处理,这样应该会分批同步处理快一些。
sagaxu
2024-10-17 08:47:12 +08:00
这是两个步骤

1. b 服务从 db 获取几十万条数据
2. a 服务从 b 服务获取完整数据

第二个步骤在分页之后,从 1 次 rpc 变成几十次,内网 rpc 的开销是毫秒级的,几十次 rpc 增加几十毫秒,不会显著拉长处理时间。

那问题就出在第一步,db 端分页之后,几十次小量查询,开销远大于单次全量。这种情况就不建议分页,而是分批,b 服务一次查询分批读取,写入文件或者消息队列等暂存设施,返回给 a 的是数据的指向,a 自己再分批读取
ymmud
2024-10-17 08:58:30 +08:00
才几十万条,服务之间类似于流式处理直接拉过去就行了
SmartTom
2024-10-17 09:02:18 +08:00
a 服务直接做多数据源直连 b 服务数据库/doge
povsister
2024-10-17 09:05:27 +08:00
你这种 case 如果数据量持续上升,应该用 spark 这种离线作业,或者压根不应该拆分服务。
Wh1t3zZ
2024-10-17 09:13:42 +08:00
流式数据处理
Plutooo
2024-10-17 09:21:12 +08:00
把 B 服务当成直接从数据库查不也是存在一样的问题么,还是说担心 B 服务的内存占用
landerwong99
2024-10-17 09:34:23 +08:00
要么就离线近源处理,来个服务直接调 B 库的只读库,
要么就流式处理,使用 kafka 之类的。
ZZ74
2024-10-17 09:41:58 +08:00
搞那么麻烦干啥,导出文件写入共享目录,调用接口通知 喂 数据我放到 xx 目录下的 x 文件里了
lifei6671
2024-10-17 09:47:03 +08:00
一般情况下是通过下面方式实现的:
1 、建立只读线下备库,通过从库的方式从线上库实时同步数据,不能用于线上系统读,只能用于线下业务大批量读。
2 、建立只读从库,和主库实时同步,只能进行线上系统只读。
3 、通过 binlog 实时建立分析宽表,一般用来汇总各个业务方数据,建立大宽表,支持线下业务分析已经大批量查询等。
kaf
2024-10-17 09:47:29 +08:00
流格式数据
8355
2024-10-17 09:59:21 +08:00
有 id 能排序的话 传起始 id 过来就行了 where id > xx limit 10000 order by id asc
8355
2024-10-17 10:01:14 +08:00
其实数据没这么大,我的的业务天天导入 300m 的 csv ,200w 左右。
只要不是一两百个字段带 text 的宽表数据 不会特别大的。
fengpan567
2024-10-17 10:07:07 +08:00
没条件搞数据同步服务的,直接让对方生成一个 csv 上传到 oss ,你每天去捞当天的文件同步就行了
print1024
2024-10-17 10:27:56 +08:00
如果数据库 id 是有序的话可以先排序,然后切分数据,如 1000 条一次,多线程处理,也就这样了,用中间件其实没太大必要

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

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

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

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

© 2021 V2EX