在 DevContainers 中高效管理 Celery、CeleryBeat、Flower 和 FastAPI

Docker

使用 Docker 配置文件简化您的开发工作流程

在开发过程中管理背景任务可能很棘手,尤其是当您兼顾芹菜,芹菜,花和Fastapi等多种服务时。如果您在Visual Studio Code中使用DevContainer设置,则可能会发现一次启动所有服务的势力。当您与付费API合作时,这在开发过程中不需要活跃时尤其具有挑战性。

想象一下,即使您只需要偶尔需要它们,您的芹菜工人每五分钟就会自动连接到每五分钟的昂贵API。这不仅浪费了资源,而且还使调试和工作流优化复杂化。好消息是Docker配置文件可以简化此过程。

Docker 配置文件允许您根据当前任务有选择地运行特定容器。例如,您可以首先仅使用 Redis 和 Postgres 等基本服务,然后根据需要启动 Celery 和 Flower。这种方法可确保您的开发环境既灵活又经济高效。 🚀

在本指南中,我们将介绍在DevContainer中管理这些服务的实用设置。您将学习如何避免常见的陷阱,并在不破坏工作流程的情况下实现平稳的任务执行。最后,您将准备一个量身定制的设置,以支持您独特的开发需求。让我们潜入! 🌟

FastAPI、Celery 和相关服务的动态 Docker 设置

该脚本使用 Python 和 Docker Compose 在开发环境中配置动态服务管理。服务设置为仅在需要时运行,从而优化资源使用。

# Docker Compose file with profiles for selective service activation
version: '3.8'
services:
  trader:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ../:/app:cached
      - ~/.ssh:/home/user/.ssh:ro
      - ~/.gitconfig:/home/user/.gitconfig:cached
    command: sleep infinity
    environment:
      - AGENT_CACHE_REDIS_HOST=redis
      - DB_URL=postgresql://myuser:mypassword@postgres:5432/db
    profiles:
      - default
  celery:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ../:/app:cached
    command: celery -A src.celery worker --loglevel=debug
    environment:
      - AGENT_CACHE_REDIS_HOST=redis
      - DB_URL=postgresql://myuser:mypassword@postgres:5432/db
    profiles:
      - optional
  redis:
    image: redis:latest
    networks:
      - trader-network
    profiles:
      - default

使用Python脚本优化芹菜初创公司

此 Python 脚本根据用户操作自动启动 Celery 服务。它使用 Docker SDK for Python 来控制容器。

import docker
def start_optional_services():
    client = docker.from_env()
    services = ['celery', 'celerybeat', 'flower']
    for service in services:
        try:
            container = client.containers.get(service)
            if container.status != 'running':
                container.start()
                print(f"Started {service}")
            else:
                print(f"{service} is already running")
        except docker.errors.NotFound:
            print(f"Service {service} not found")
if __name__ == "__main__":
    start_optional_services()

Celery 工作流程的单元测试

该Python测试脚本使用Pytest来验证Celery任务执行环境,确保模块化和正确性。

import pytest
from celery import Celery
@pytest.fixture
def celery_app():
    return Celery('test', broker='redis://localhost:6379/0')
def test_task_execution(celery_app):
    @celery_app.task
    def add(x, y):
        return x + y
    result = add.delay(2, 3)
    assert result.get(timeout=5) == 5

通过选择性容器管理优化开发

当从事像这样的项目时 使用背景任务经理的应用程序,例如 和 CeleryBeat,有选择地管理容器生命周期变得至关重要。这种方法使您能够保持轻量级开发,同时专注于核心功能。例如,在开发过程中,您可能只需要 FastAPI 服务器和数据库容器处于活动状态,为特定的测试场景保留 Celery 工作线程。利用 Docker Compose 配置文件,您可以将容器分为“默认”和“可选”等类别,从而帮助实现这一目标。

另一个关键方面是确保诸如 Flower(用于监视 Celery)之类的附加服务仅在明确需要时启动。这减少了不必要的开销,并避免了潜在的昂贵操作,例如在例行开发期间与外部 API 交互。为了实现这一点,开发人员可以使用 Docker SDK 脚本或在容器的生命周期挂钩中预先配置命令。该技术可确保高效的资源利用而不影响功能。例如,想象一下调试一个失败的任务:您可以为此目的临时启动 Celery 工作线程和 Flower。 🌟

最后,通过单元测试测试整个设置可确保这些优化不会导致回归。编写自动测试以验证芹菜任务,重新连接或数据库集成可以节省时间和精力。这些测试可以模拟现实世界的场景,例如排队任务并验证其结果。通过将Docker概况,自动脚本和健壮的测试相结合,开发人员可以在需要时保持敏捷有效的工作流程,同时有效地扩展。 🚀

  1. Docker构成个人资料的目的是什么?
  2. 它们允许将服务分组为逻辑类别,从而实现容器的选择性启动。例如,“默认”配置文件可以包括 FastAPI 等基本服务,而“可选”配置文件包括 工人。
  3. 如何从可选配置文件中启动特定服务?
  4. 使用命令 仅启动“可选”配置文件中的容器。
  5. 使用Docker SDK来管理容器的优点是什么?
  6. Docker SDK可以通过Python脚本对容器进行程序化控制,例如动态启动或停止特定服务。
  7. 如何实时监视芹菜任务?
  8. 您可以使用基于网络的监视工具Flower。开始使用它 通过 Web 界面查看任务进度和日志。
  9. 仅按需运行 Celery 工作线程有什么好处?
  10. 它节省了资源并避免了不必要的 API 调用。例如,您可以延迟启动工作程序,直到特定的集成测试需要后台任务处理。

有效管理开发资源对于保持生产力至关重要。通过有选择地启动 Celery 和 Flower 等服务,开发人员可以专注于构建功能,而不会受到不必要的干扰。 Docker Compose 配置文件简化了这个过程,确保资源得到明智的使用。

脚本和测试框架通过提供动态服务激活和验证,进一步增强了此设置。这些工具结合在一起,提供了一个灵活而健壮的环境,使开发人员可以轻松调试和部署其FastAPI应用程序。 🌟

  1. 关于使用Docker组成的个人资料进行选择性服务激活的见解 Docker 文档
  2. Celery 和 FastAPI 集成的实用指南基于以下位置提供的教程: 芹菜项目
  3. 使用 Flower 进行任务监控优化开发的步骤受到以下文章的启发 花文档
  4. 从使用Python Docker SDK用于动态容器管理的详细信息 Docker SDK for Python
  5. Celery 任务的测试和调试方法由 Pytest Django指南