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

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

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

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

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

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

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

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

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

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

© 2021 V2EX