请问静态资源取走后删除怎么做性能最高,代码最简洁呢

2020-06-29 20:18:58 +08:00
 Te11UA

首先说一下是 Python 技术栈,现在需求是有大量的文件不断生成在一个目录下(文件几 k 到几百 k 不等,同期数量约 20W ),想做一个服务,使得其它服务来请求的时候能快速地取走该文件,并在取走后删除。

当然,最简单的做法就是 Tornado/Flask 直接写个接口,然后 os.remove 就行,想问下大伙儿还有什么高效率的方法来实现吗?

4331 次点击
所在节点    Python
38 条回复
jedihy
2020-06-30 04:07:22 +08:00
19 楼的方案应该是最简单高效的了。
em70
2020-06-30 05:24:57 +08:00
瓶颈到底在哪里? 最简单方法先实现跑起来再谈优化啊
GTim
2020-06-30 08:18:49 +08:00
一种不知道可不可行的方案是使用 nginx-lua 中的 `log_by_lua` 在这个脚本文件里删除,我没试验过,不知道可不可行
dbolo123
2020-06-30 08:27:07 +08:00
直接 nginx 返回,每天跑个脚本分析是 access log,删掉文件就好?
yaleyu
2020-06-30 09:00:27 +08:00
@hurrytospring 赞同这个方案,空闲时候比如半夜再删除
enjoyCoding
2020-06-30 09:04:10 +08:00
两个服务 一个取 取完了通知另一个删除
删除放一个标志位或者存到一个数组里面 一个一个删除
说到底还是异步
encro
2020-06-30 09:06:37 +08:00
写都没问题,删还会成问题了?所以为什么不取的时候同时删除呢?

或者取的时候写入队列,通过 crontab 或者 supervisord 脚本任何时候想删就删。
clf
2020-06-30 09:16:03 +08:00
既然这样读写删除性能差,那么为什么要生成文件呢……看上去就是消息队列一样的功能……
xjmroot
2020-06-30 09:27:58 +08:00
如果是用 Nginx 做代理,访问文件时会有 Nginx 日志,将日志入到 kafka
写个 kafka 消费者消费 Nginx 日志删除文件
Te11UA
2020-06-30 09:37:54 +08:00
@SlipStupig @lychs1998 因为内存少昂,你的意思是将文件内容缓存到消息队列是吗 ?
@realpg @billlee 的确不是什么大问题,性能也可以接受,我只是想问下还有什么方式可以去做~当然,这也可能是我过早优化了
crclz
2020-06-30 09:43:23 +08:00
20w 个文件还是直接用数据库好了,让生产者把文件放数据库里面。传统的关系型数据库都行。
Huelse
2020-06-30 10:15:03 +08:00
既然时先取后删,建议还是延时删除吧,还可以避开访问高峰
SlipStupig
2020-06-30 13:22:33 +08:00
@Te11UA 是的啊,队列不是在不停消费嘛,不会占用太多,如果怕占用大,可以压缩后再存
VictorJing94
2020-06-30 15:55:37 +08:00
取走后给文件加标识?定期统一处理?
est
2020-06-30 16:30:57 +08:00
高效的方法是建立个删除队列。用一个后台进程慢慢删。
009694
2020-06-30 16:53:38 +08:00
celery 异步删除
SjwNo1
2020-06-30 17:09:17 +08:00
消息队列或者 19 楼的做法都行
no1xsyzy
2020-06-30 17:47:40 +08:00
一致性的要求?是否完整地取走才能被删?取一半对方 RST 了怎么办?取一半 Python 线程 / 进程挂了怎么办?
是否要确认对方确实完全收到?是否要求对方无误地收到?

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

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

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

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

© 2021 V2EX