Redis 和 RabbitMQ 可能是使用 Celery 时的首选代理,但是当您在本地开发时,它们可能会让人觉得大材小用。 Celery 5.4 的文档提到您可以使用 SQLite 作为本地开发的实验代理。然而,当您导航到 Celery 的后端和代理页面时,唯一提到的 SQL 是针对 SQLAlchemy 后端。值得庆幸的是,该页面指出,“本节并未全面介绍后端和代理。”
这篇文章将向您展示如何在 Django 项目中为 Celery 实现 SQLite 代理(或任何 SQL!)。这篇文章不会教你使用 Celery:查看 Celery 官方文档。
出于本文的目的,我们假设您已经有一个现有的 Django 项目,并且使用 Celery 官方“Django 的第一步”指南中的步骤安装了 Celery。 Celery 后端不是必需的,但您可能需要按照指南的步骤安装和配置 django-celery-results。如果您不清楚 backends 和 brokers 之间的区别,请查看我的文章“了解 Celery 中的任务、brokers、workers 和后端”。
除非另有明确说明,所有源文档链接均适用于发布时(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 工作线程。”
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3