跳转到主要内容

Metroid - Django的Metro

项目描述


Metroid

订阅、行动、发布。

Python version Django version Celery version ServiceBus version Django GUID version

Codecov Pre-commit Black mypy isort

Metroid - Django的Metro

此应用程序旨在通过以下方式简化所有Django+Celery用户的Metro集成:

  • 使用一个命令异步处理订阅和消息
  • 根据在settings.py中定义的主题执行Celery任务
  • 当使用MetroidTask基类时,通过您的管理仪表板重试失败的任务

概述

  • python >= 3.10
  • django >= 4.2 - 用于asgiref和设置
  • django-guid >= 3.2.0 - 在数据库中存储失败任务的相关ID,使调试变得容易
  • 选择一个
    • celery >= 5.3.0 - 根据主题执行任务
    • django-rq >= 2.4.1 - 根据主题执行任务

实现

python manage.py metroid 应用程序完全异步,没有任何阻塞代码。它使用 Celery 来执行任务。

它的工作原理是

  1. 遍历所有配置的订阅并为每个订阅启动一个新的异步连接
  2. Metro 在订阅上发送消息
  3. 此应用程序将过滤出与您定义的主题匹配的消息,并将一个 Celery 任务排队以执行该主题指定的函数
    3.1. 如果没有找到该主题的任务,则将消息标记为完成
  4. Celery 任务成功排队后,消息将被标记为完成
  5. 如果任务失败,将在您的数据库中自动创建一个条目
  6. 所有失败的任务都可以通过管理员仪表板手动重试

配置和安装此软件包

注意 有关完整示例,请参阅 demoproj/settings.py

  1. settings.py 中创建一个包含所有订阅和处理程序的 METROID 键。示例设置
METROID = {
    'subscriptions': [
        {
            'topic_name': 'metro-demo',
            'subscription_name': 'sub-metrodemo-metrodemoerfett',
            'connection_string': config('CONNECTION_STRING_METRO_DEMO', None),
            'handlers': [
               {
                  'subject': 'MetroDemo/Type/GeekJokes',
                  'regex': False,
                  'handler_function': 'demoproj.demoapp.services.my_func'
                }
            ],
        },
    ],
   'worker_type': 'celery', # default
}

通过提供作为字符串的完整点路径来定义 handler_function。例如,from demoproj.demoapp.services import my_func 作为 'demoproj.demoapp.services.my_func' 提供。

处理程序的主题可以是正则表达式或字符串。如果提供了正则表达式,则必须将变量 regex 设置为 True。示例

'handlers': [{'subject': r'^MetroDemo/Type/.*$','regex':True,'handler_function': my_func}],
  1. 通过将应用程序添加到您的已安装应用程序、中间件并按照此处所述配置日志记录来配置 Django-GUID。确保您启用了 CeleryIntegration
from django_guid.integrations import CeleryIntegration

DJANGO_GUID = {
    'INTEGRATIONS': [
        CeleryIntegration(
            use_django_logging=True,
            log_parent=True,
        )
    ],
}

创建您自己的处理程序函数

您的函数将使用以下关键字参数调用

messagetopic_namesubscription_namesubject。换句话说,您的函数应该看起来像这样

Celery
@app.task(base=MetroidTask)
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:
rq
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:

运行项目

  1. 确保 Redis 正在运行
docker-compose up
  1. 运行迁移
python manage.py migrate
  1. 创建一个管理员账户
python manage.py createsuperuser
  1. 启动一个工作进程
celery -A demoproj worker -l info
  1. 运行订阅者
python manage.py metroid
  1. 向 Metro 发送消息。示例代码可以在 demoproj/demoapp/services.py 中找到
  2. 运行 web 服务器
python manage.py runserver 8000
  1. http://localhost:8080/admin 下查看失败的消息

要贡献,请参阅 CONTRIBUTING.md

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源分布

metroid-1.4.0.tar.gz (15.0 kB 查看散列)

上传时间

构建分布

metroid-1.4.0-py3-none-any.whl (18.1 kB 查看散列)

上传时间 Python 3

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面