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

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

其实这里使用多线程意义不大,因为单线程也可以打满网络 IO
ty89
2019 年 3 月 18 日
典型的”生产者-消费者”模型

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