问题描述:
用户导出 excel 文件, excel 里面的内容需要经过复杂的查询和计算,如果数量很多,就会导致服务器压力较大,而且会超时倒不出来
解决办法:
采用 celery+redis ,后台队列运行,但是经常会出现任务丢失的情况,有的时候能导出,有的时候导出就没下文了。
不知道有没有其他解决办法?谢谢
     1 
                    
                    jswh      2017-01-12 12:04:05 +08:00 
                    
                    为什么不去修 bug? 
                 | 
            
     2 
                    
                    ming2050      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' 
                 |