服务端处理耗时任务思路

2017-07-03 20:43:09 +08:00
 itertools

需求是客户会上传单个或者很多文件,要求提供的接口把处理结果返回客户端。 我目前的思路有: 对于单个文件可以直接等待处理完成,然后把结果返回客户端。 对于批量文件可以通过 celery 把处理任务发送其他 worker 去处理,然后,返回一个新的接口供客户端进行结果轮询。

(服务端处理这些文件需要好几分钟) 现在有几个问题就是:

谢谢!

3758 次点击
所在节点    Python
13 条回复
fatedier
2017-07-03 21:04:03 +08:00
异步任务 && IO 多路复用
Reign
2017-07-03 21:09:01 +08:00
与其在这多耗脑细胞不如多买几台服务器
beneo
2017-07-03 21:11:27 +08:00
上传都走 CDN,客户端传 URL 到服务端
misaka19000
2017-07-03 21:26:20 +08:00
@Reign 服务器就是钱啊。。。
misaka19000
2017-07-03 21:29:18 +08:00
感觉用户量多的时候无解,只能做集群来提升任务处理能力
itertools
2017-07-03 21:37:19 +08:00
@fatedier 那有什么异步框架可以推荐下?
还有几个疑问请教:就是如果服务端接口采用异步框架处理这个任务。
(假设这耗时任务使用了 5 分钟)
1.如果客户端使用同步请求,那么客户端是否就一直阻塞五分钟?这样不会出现请求超时,连接中断问题吗?
2.如果客户端使用异步请求,那么客户端五分钟之后就能接到处理结果?这五分钟之内是怎么保持连接不中断的?

谢谢!
SlipStupig
2017-07-03 21:46:14 +08:00
@beneo 上传走 cdn 作用不大,都是 stream 数据,cdn 根本 cache 不到
我的想法是 HAProxy 做负载均衡,后台开多个 server,用 celery 可以开多个 worker,可以选 gevent,然后把相关数据全部存储到远程的对象存储(建议用第三方)上,当客户请求,相应相关 URL,让客户端下载就行了,多个和一个没什么区别?
yidinghe
2017-07-03 23:20:04 +08:00
统一用轮询来查询处理状态,这样给将来留下的余地比较好。
mooncakejs
2017-07-03 23:23:07 +08:00
@SlipStupig 他说的是直传
em70
2017-07-03 23:25:13 +08:00
可以看看优酷,YouTube 对上传视频转码是如何处理的,上传后出现到列表,状态显示正在处理,用户可以随时上来看处理完了没
ericls
2017-07-03 23:27:36 +08:00
我觉得只要用 websocket 让客户知道处理的进度就好了
Morriaty
2017-07-04 12:01:37 +08:00
接口直接返回一个 upload_id,异步处理上传,再给一个查询 upload_id 进度的接口
ma125125t
2017-07-04 14:42:40 +08:00
文件存储用第三方

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

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

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

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

© 2021 V2EX