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