问题描述:
用户导出 excel 文件, excel 里面的内容需要经过复杂的查询和计算,如果数量很多,就会导致服务器压力较大,而且会超时倒不出来
解决办法:
采用 celery+redis ,后台队列运行,但是经常会出现任务丢失的情况,有的时候能导出,有的时候导出就没下文了。
不知道有没有其他解决办法?谢谢
1
jswh 2017-01-12 12:04:05 +08:00
为什么不去修 bug?
|
2
mringg 2017-01-12 12:07:14 +08:00
既然都用上 celery 那么还是你们自己的问题 而不是解决方案的问题
|
3
maemo 2017-01-12 12:23:19 +08:00
试试 celery+rabbitmq 呢,我记得官方文档有说 redis 会有任务丢失的问题
|
5
Zuckonit 2017-01-12 12:33:31 +08:00
确定丢失是因为 celery 的原因?
|
12
50vip 2017-01-12 13:37:08 +08:00
并不会出现楼主所说的任务丢失。仅仅是定时任务多次执行的问题。
|
14
wwqgtxx 2017-01-12 13:49:53 +08:00 via iPhone
我用 python-rq 觉得挺稳定的,没试过 celery
|
15
gecco 2017-01-12 13:52:13 +08:00
优化这个复杂的查询
|
16
est 2017-01-12 13:56:37 +08:00
先生成一个 下载 id 返回给客户端
然后客户端用另一个 API 可以轮询下载 ID 是否就绪。 |
18
nanlong 2017-01-12 16:08:16 +08:00
|
20
chenqh 2017-01-12 18:09:18 +08:00
直接邮件啊
|
21
maemo 2017-01-12 18:41:04 +08:00
@alvy 在这里 http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#redis
Redis is also feature-complete, but is more susceptible to data loss in the event of abrupt termination or power failures. |
22
ipconfiger 2017-01-12 18:42:14 +08:00
改 bug 去
|
23
spice630 2017-01-12 21:24:31 +08:00
压力大就加机器啊。你也没说清楚是计算压力大还是带宽有瓶颈
推荐你用 golang ,也许就不会有修不完的问题了。 python 的第三方库有多少人维护你都不知道, bug 提给谁 会不会有人修你也不知道,这种情况用在生产环境就是 灾难。 |
24
spice630 2017-01-12 21:27:03 +08:00
另外 我们写 python 的同事今天刚刚放弃 flask ,程序崩溃找不到原因。
|
26
coolair 2017-01-12 23:46:25 +08:00 via Android
第三方库 bug 修的很慢,半年以上是常有的事,修了要进 pip 又得好久,然后,好多库你都维护了一个自己的版本,累。
|
27
iamfredng 2017-01-13 01:08:33 +08:00
我只想说你干嘛不开个线程?丢后面慢慢做,好了之后再回写一下结果?
|
36
eyp82 2017-01-13 23:56:06 +08:00
@julyclyde http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html
Redis is also feature-complete, but is more susceptible to data loss in the event of abrupt termination or power failures. Detailed information about using Redis: 只是说断点或者异常终止的情况下**有可能**会丢数据, 应该是 Redis 轻量化设计的外沿就到这了. 正常运行的时候应该不至于老丢数据, 否则就是大 bug 那还了得. |
37
eyp82 2017-01-13 23:57:27 +08:00
楼上有说 Python 第三方库有问题然后转 golang 的, 按我的理解 golang 的第三方库也会有类似的问题啊? 还是说 golang 第三方库审核很严格, 长时间不更新就给踢出去, 所以能留下的都是精品?
|
38
skywatcher 2017-01-14 01:15:48 +08:00
既然慢就异步,感觉 celery+redis 应该是能解决你的问题。第一个 check 会不会是你的 redis 被另一个调用方清理了,然后记得详细打印日志,很有可能是 celery 任务里执行失败了。我们整个公司的应用发布任务都在 celery+redis 里,没发现你说的问题。
|
39
iamfredng 2017-01-14 16:17:51 +08:00
@alvy 我有个游戏客户端编译系统就是在 Flask 上开发的。编译个客户端轻则 10 分钟以上,也是开个线程后面慢慢编译,好了通知一下 Flask 完成。 web 就 js 轮询结果即可
|
40
alvy OP @skywatcher 求教,多台 web 服务器的 celery 公用有个 redis 的数据库可以吗? celery 启用几个 worker 合适?
|
44
liyj144 2017-01-16 11:24:46 +08:00
用 flower 监控下 celery ,大并发下 celery 可能会有处理失败,但是应该不会丢失任务(除非 broker 存储的任务丢失,这就是 redis 或 mq 配置问题了)。
|
45
skywatcher 2017-01-16 14:25:43 +08:00
@alvy 共用一个 redis 没什么问题,但是不要清空别的 web 的数据,前缀要不一样,最好能分开。我们是一台 4 核 8G 的虚拟机启用 8 个 worker , worker 不够你可以多台机器同时开启 worker 一起去抢 redis 的任务
|
46
alvy OP @skywatcher "但是不要清空别的 web 的数据,前缀要不一样,最好能分开" ,我不太明白。我现在有 3 台服务器,每台启动两个 worker ,配置是 CELERYD_NODES=2 , 3 台服务器 celery 的 broker 都是练的同一个 redis ,但是簇不一样,比如一台服务器的 broker 是 CELERY_RESULT_BACKEND = 'redis://10.174.93.111:6379/5',另一台是 CELERY_RESULT_BACKEND = 'redis://10.174.93.111:6379/2'
|