这个与芹菜有关的问题是否有解决方案? https://github.com/celery/celery/issues/3519

Has there been a fix for this issue related to celery? https://github.com/celery/celery/issues/3519

Celery 似乎同时选择了我的旧代码和新代码。我尝试过清除缓存、清除代理队列 (redis)、重新启动 celery 等。但是 none 似乎解决了这个问题。

就上下文而言,我们会定期向各种服务器发布新版本。 Web 应用程序在后端使用 Django rest 框架,并使用 celery 来调度异步任务。最近当我们部署新版本的代码时,应用程序表现得很奇怪。它有来自 运行 的旧代码和部分新代码的工件。在我们找到一个 github 线程 (https://github.com/celery/celery/issues/3519) 之前,这是非常奇怪的行为,它概述了我们所面临的问题。该线程中的这个问题似乎没有好的答案,因此将其张贴在这里,以便如果任何了解 celery 的人知道我们可以阻止 celery 拾取旧工件的解决方法。

部署是通过 Jenkins 构建脚本完成的。请在下面找到相同的脚本。出于显而易见的原因,我已将我们的应用程序名称替换为“proj”。

sudo /bin/systemctl stop httpd
sudo /bin/systemctl stop celery
/bin/redis-cli flushall
/srv/proj/bin/pip install --no-cache-dir --upgrade -r /srv/proj/requirements/staging.txt
/usr/bin/git fetch
/usr/bin/git fetch --tags
/usr/bin/git checkout $TAG
/srv/proj/bin/python manage.py migrate
sudo /bin/systemctl restart httpd
sudo /bin/systemctl restart proj
sudo /bin/systemctl start celery

OP,问题几乎总是在您的服务器上包含旧代码。有两个可能的问题:

  1. checkout 命令失败。 checkout 如果目录有本地更改,则可能无法切换分支。此外,部署脚本不会 pull 服务器的最新更改。我们使用的更常见的方法是将 venv 放在另一个目录中,然后将存储库部署 clone 到一个新目录(版本化)。然后切换“主”应用程序目录 link 以指向最新版本。比如后者就是aws的elastic beantalk中使用的方法。
  2. 还有芹菜的杂散过程运行。根据您启动/停止 celery 的方式,可能仍然存在 celery 的杂散过程和 运行 您的旧代码。

最终,如果不确认所有服务器都 100% 相同,您将无法诊断此问题。因此,如果您有开发人员或管理员通过 ssh 连接到这些盒子,那么他们中的一个或多个可能会做出一些影响 (1) 或 (2) 的更改。