小编wus*_*r92的帖子

多个celerybeat实例用于弹性豆秆上的自动标定django app

我试图找出构建Django应用程序的最佳方法,该应用程序使用Celery在自动缩放AWS ElasticBeanstalk环境中处理异步和计划任务.

到目前为止,我只使用了Celery + Celerybeat的单个实例Elastic Beanstalk环境,这非常好用.但是,我希望在我的环境中运行多个实例,因为每个实例都会崩溃,并且在实例重新启动之前需要花费很多时间,但是我无法将当前的体系结构扩展到多个实例,因为Celerybeat应该在所有实例中只运行一次,否则Celerybeat安排的每个任务将被多次提交(对于环境中的每个EC2实例一次).

我已经阅读了多个解决方案,但是所有这些解决方案似乎都存在一些问题,这些问题并不适用于我:

  • 使用django cache + locking:这种方法更像是一个快速解决方案,而不是一个真正的解决方案.如果您有许多计划任务并且需要添加代码来检查每个任务的缓存,则这不是解决方案.此外,任务仍然会多次提交,这种方法只能确保重复项的执行停止.
  • 使用leader_only选项与ebextensions:做工精细最初,但如果在环境崩溃或EC2实例被替换,这将导致在没有Celerybeat是运行在所有的情况下,因为领导者是在创设环境只被定义一次.
  • 为Elastic Beanstalk工作层中的异步任务创建一个新的Django应用程序:很好,因为Web服务器和工作人员可以独立扩展,并且Web服务器性能不受工作人员执行的巨大异步工作负载的影响.但是,此方法不适用于Celery,因为工作层SQS守护程序会删除邮件并将邮件正文发布到预定义的URL.此外,我不喜欢有一个完整的额外Django应用程序的想法,需要从主应用程序导入模型,如果在主应用程序中修改任务需要单独更新和部署.

如何在分布式Elastic Beanstalk环境中将Celery与计划任务一起使用而不进行任务复制?例如,如何确保在Elastic Beanstalk环境中始终在所有实例中运行一个实例(即使Celerybeat的当前实例崩溃)?

有没有其他方法可以实现这一目标?在Django中使用Elastic Beanstalk的Worker Tier环境的最佳方法是什么?

python django celery celerybeat amazon-elastic-beanstalk

11
推荐指数
1
解决办法
675
查看次数

如何使 websocket 与 traefik 和 docker 一起工作?

我已经阅读了这里和其他论坛上所有相关的 traefik / websocket 问题,但我无法解决我的设置问题。

我正在尝试在 Traefik 后面运行 Dataiku DSS 作为反向代理。但我对 Traefik 还很陌生,不知道如何通过 Traefik 为我的服务工作创建 websocket。

我正在使用以下配置:

traefik.yml:

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  http:
    acme:
      email: admin@example.com
      storage: acme.json
      httpChallenge:
        entryPoint: http
Run Code Online (Sandbox Code Playgroud)

traefik/docker-compose.yml:

version: '3'

services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http" …
Run Code Online (Sandbox Code Playgroud)

websocket docker traefik

6
推荐指数
0
解决办法
3147
查看次数