在 Django 中使用 SQLite 作为 Celery 代理
redis 和 rabbitmq 可能是使用 celery 时的首选代理,但当您在本地开发时,它们可能会让人感觉大材小用。 celery 5.4 的文档提到您可以使用 sqlite 作为本地开发的实验代理。然而,当您导航到 celery 的后端和代理页面时,唯一提到的 sql 是针对 sqlalchemy 后端。值得庆幸的是,该页面指出,“本节并未全面介绍后端和代理。”
这篇文章将向您展示如何在 django 项目中为 celery 实现 sqlite 代理(或任何 sql!)。这篇文章不会教你使用 celery:查看 celery 官方文档。
出于本文的目的,我们假设您已经有一个现有的 django 项目,并且使用 celery 官方“django 的第一步”指南中的步骤安装了 celery。 celery 后端不是必需的,但您可能需要按照指南的步骤安装和配置 django-celery-results。如果您不清楚后端和经纪人之间的区别,请查看我的文章“了解 celery 中的任务、经纪人、工作人员和后端”。
除非另有明确说明,所有源文档链接均适用于发布时(2024 年 7 月)当前版本的 django、celery 和 sqlalchemy。如果你在遥远的将来读到这篇文章,事情可能已经改变了。
虽然 celery 管理任务和队列,但它委托给另一个名为 kombu 的库来与代理交换消息。 rabbitmq 和 redis 是 kombu 功能最齐全的传输(代理),但它还具有适用于 amazon sqs、zookeeper 和 mongodb 的虚拟传输。
隐藏在 kombu 文档的最角落里的是一个支持 postgresql、mysql 和 sqlite 的 sqlalchemy 传输模型。曾几何时,sqlalchemy 代理甚至在 celery 的网站上有记录,但此后它已从库的新版本的文档中删除。尽管如此,它仍然足以满足当地的发展。
要在 django 应用程序中使用后续数据库作为 celery 代理,请首先安装 sqlalchemy:
pip install sqlalchemy
在 django 项目的 settings.py 文件中,您可以使用 celery_broker_url 设置来设置代理的后端:
# base_dir is the directory of your project's main directory. celery_broker_url = f"sqlalchemy+sqlite:////{base_dir}/broker.sqlite3"
sqlalchemy 经纪人 url 由 3 部分组成:
mac/unix 和 windows 上的 sqlite 连接字符串是不同的:
# macos/unix celery_broker_url = "sqla+sqlite:////your/project/path/broker.sqlite3" # windows celery_broker_url = "sqla+sqlite:///c:your\\project\\path\\broker.sqlite3"
您还可以使用 postgres 作为 celery 代理,或者您也可以轻松使用 mysql 作为 celery 代理:
# mysql celery_broker_url = "sqlalchemy+mysql://scott:tiger@localhost/foo" # postgresql celery_broker_url = "sqla+postgresql://scott:tiger@localhost/mydatabase" # posgresql connecting using pg8000 celery_broker_url = "sqla+postgresql+pg8000://scott:tiger@localhost/mydatabase"
您可能需要安装其他库来连接 mysql 或 postgresql,您安装的库可能会影响 sqlalchemy 连接字符串。检查 sqlalchemy 数据库 url 文档以获取更多详细信息。
无论您选择哪个数据库,您都可能需要考虑将代理 url 存储在环境变量中,以便在不同环境中轻松更改:
CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL")
sqlalchemy 传输可能被认为是实验性的,因此它不适合生产使用。可能会发生数据丢失,或者消息可能会被多次传送。考虑切换到 celery 的经纪商和后端页面上列出的更强大的经纪商。
也就是说,这对于本地开发,甚至小型副项目来说可能没问题。但如果将来无法使用 sqlalchemy 作为代理,我也不会感到震惊。
在本地运行 celery 后,您就可以开始开发队列驱动的应用程序了。然而,您可能会发现它缺乏自动重新加载是一个摩擦点。如果您想在 django 应用程序中设置自动 celery 重新加载,请阅读我的文章“使用自定义 django 命令自动重新加载 celery 工作线程。”
以上就是在 Django 中使用 SQLite 作为 Celery 代理的详细内容,更多请关注php中文网其它相关文章!