挑战自我:从数据库取出 100 万数据并发送到指定接口,如何设计才能时间最短。

2019-03-18 14:33:05 +08:00
 codeismylife
单表有 100 万数据,我要从中取出,然后 update 状态为‘已取出’,然后发送到指定的 http 接口,发送成功的话再将状态改为‘已发送’,请问各位大神如何设计才能时间最短。
1358 次点击
所在节点    问与答
8 条回复
sujin190
2019-03-18 14:39:31 +08:00
如果结果只是需要统计展示的话,最快的应该是再加两个表,一个存是否出去,一个存是否发送,把更新操作变成批量写是最快的了吧,到时再联表查一下就出来了
codeismylife
2019-03-18 14:42:28 +08:00
@sujin190 我也想过,业务上不允许,所以只能从多线程之类的角度来考虑了。
maxiaofeng
2019-03-18 14:48:56 +08:00
@sujin190 咋不直接加两个字段
sujin190
2019-03-18 16:31:22 +08:00
@maxiaofeng #3 加两个字段不还是更新操作么?这种情况就要把更新操作变成批量写才快啊
sujin190
2019-03-18 16:32:44 +08:00
@codeismylife 那要不就新写到新表里,全部做完之后统一合并之后批量更新,如果字段值占用字节数不变,批量更新估计也不慢
FrailLove
2019-03-18 16:34:55 +08:00
我怎么感觉 “从数据库取出 100 万数据并发送到指定接口” 是个伪需求
mortonnex
2019-03-18 16:46:10 +08:00
瓶颈全在 IO 上:
1.优化数据库连接和 sql
2.网络用 netty,利用零拷贝
3.多线程,每个线程负责一部分数据
4.批量更新,因为 update 会锁表

其实这里使用多线程意义不大,因为单线程也可以打满网络 IO
ty89
2019-03-18 17:09:01 +08:00
典型的”生产者-消费者”模型

1,一次取出一批数据,把待处理数据放进队列中。如果数据已经在队列里,那么状态就是‘已取出’,这样避免了 update 操作

2,足够多的 worker
3,取出数据之后,放进 redis 里

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

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

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

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

© 2021 V2EX