构建健壮、可扩展的应用程序通常意味着处理需要多个服务器或线程才能有效处理的任务。无论是处理图像、发送电子邮件还是执行数据量大的计算,将这些任务卸载到任务队列都是最佳实践。对于我的人工智能信息图表生成器 Text2Infographic 来说,挑战很明显:我需要高效处理大量同时提交的作业,同时保持流畅的用户体验。这促使我采用了 Celery(一个强大的分布式任务队列)和 Supervisord(一个流程管理系统),所有这些都使用以下功能无缝部署在 AWS Elastic Beanstalk 上.ebextensions.
这是我如何在 Elastic Beanstalk 上使用 Supervisord 设置 Celery Worker 的分步指南。但首先,让我们解开此设置的关键组件以及它们为何至关重要。
其核心,Celery 是一个分布式任务队列系统,允许您将耗时的任务卸载到单独的进程或服务器。它广泛用于 Python 应用程序以异步或按计划执行后台作业。对于 Text2Infographic,Celery 是处理根据用户输入生成自定义信息图表的计算密集型过程的完美解决方案。
使用芹菜的一些好处:
异步执行:任务可以在后台运行,而不阻塞主应用程序。
可扩展性:轻松添加更多工作人员来处理增加的负载。
可扩展性:与各种消息代理集成,如 RabbitMQ 或 Redis。
手动管理像 Celery Worker 这样的进程可能会变得很麻烦,特别是当您需要它们在崩溃后或部署期间自动重新启动时。 Supervisord 是一个轻量级流程控制系统,它通过密切关注您的流程并确保它们保持正常运行来解决此问题。
使用 Supervisord,您可以:
如果 Celery 工作失败,自动重新启动。
使用单个配置文件简化进程管理。
记录进程活动以便更好地调试和监控。
AWS Elastic Beanstalk 是一项完全托管的服务,可自动执行应用程序的部署、扩展和管理。它抽象了基础设施管理的大部分复杂性,使开发人员能够专注于编写代码而不是配置服务器。 Elastic Beanstalk 支持各种环境,从简单的 Web 服务器到更复杂的设置(如 Celery 工作线程)。
对于 Text2Infographic,Elastic Beanstalk 的可扩展性和简单性非常宝贵。随着用户需求的波动,动态扩展工作实例的能力可确保即使在高峰时段也能高效处理作业。
.ebextensions 是 Elastic Beanstalk 的一项功能,允许您在部署期间自定义环境。使用 .ebextensions 配置文件,您可以:
安装必要的软件和依赖项。
配置 Supervisord 和 Celery 工作人员等服务。
添加环境变量并管理权限。
这样就可以将 Celery 和 Supervisord 无缝集成到您的 Elastic Beanstalk 部署中,而无需每次部署时进行手动干预。
Text2Infographic 旨在帮助营销人员和内容创建者将博客文章转换为令人惊叹的信息图表。每个信息图生成请求都是计算密集型的,涉及基于人工智能的主题研究、设计优化和采购矢量图形。为了保持无缝的用户体验,这些任务必须卸载给可以同时处理多个请求的后台工作人员。 Celery 的异步任务处理和可扩展性使其成为显而易见的选择。
虽然 Elastic Beanstalk 可以本地管理 Web 服务器,但它没有对 Celery Worker 等后台进程的内置支持。输入 Supervisord。它充当 Celery 工作进程的监督者,确保它连续运行并在失败时自动重新启动。这种可靠性对于不间断地处理信息图表生成请求至关重要。
完成阶段设置后,让我们深入了解在 Elastic Beanstalk 上配置 Celery、Supervisord 和 eb_extensions 的技术细节,以便为您的应用程序创建可扩展且高效的任务队列。
在本节中,我们将介绍在 Elastic Beanstalk 上使用 Supervisord 设置 Celery 所需的 .ebextensions 文件。每个步骤都进行了详细说明,并提供了帮助您避免常见陷阱的提示。
1。安装 Supervisord
文件:01_install_supervisord.config
此文件安装 Supervisord 并设置非 root 用户以安全地运行进程。
commands: 01_install_pip: command: "yum install -y python3-pip" ignoreErrors: true 02_install_supervisor: command: "/usr/bin/pip3 install supervisor" 03_create_nonroot_user: command: "useradd -r -M -s /sbin/nologin nonrootuser || true" ignoreErrors: true
说明:
安装 pip: 确保 Python 的包管理器可用。
安装 Supervisor: 使用 pip 安装 Supervisord,一个轻量级且功能强大的进程管理器。
创建非 root 用户: 添加没有登录 shell 或主目录的受限用户(非 root 用户)。以非 root 用户身份运行进程是一种安全最佳实践。
? 提示: 当命令在重复部署期间可能失败时,请始终使用ignoreErrors: true。这可以确保如果用户或包已经存在,您的部署不会失败。
2。清理过时的进程
文件:02_cleanup_existing_supervisord.config
此文件处理旧的 Supervisord 实例和可能在部署之间徘徊的套接字文件的清理。
commands: kill_existing_supervisord: command: "pkill supervisord || true" ignoreErrors: true remove_stale_socket: command: "rm -f /tmp/supervisor.sock" ignoreErrors: true
说明:
终止现有的 Supervisord: 确保没有杂散的 Supervisord 进程正在运行。 || true 部分确保如果未找到进程,此命令不会抛出错误。
删除过时的套接字:删除任何旧的 Supervisord 套接字文件,这可能会阻止 Supervisord 启动。
? 提示: 在 Elastic Beanstalk 等环境中,清理套接字和进程至关重要,在这些环境中,部署有时可能会留下先前配置的残余。
3。使用 Supervisord 配置 Celery
文件:03_celery_configuration.config
此文件创建 Supervisord 配置文件并启动 Celery 工作进程。
files: "/etc/supervisord.conf": mode: "000644" owner: root group: root content: | [unix_http_server] file=/tmp/supervisor.sock chmod=0770 chown=root:nonrootuser [supervisord] logfile=/var/log/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/tmp/supervisord.pid nodaemon=false minfds=1024 minprocs=200 user=root [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock [program:celery] command=celery -A application.celery worker --loglevel=INFO directory=/var/app/current autostart=true autorestart=true startsecs=10 stopwaitsecs=600 stdout_logfile=/var/log/celery_worker.log stderr_logfile=/var/log/celery_worker.err.log environment=PATH="/var/app/venv/staging-LQM1lest/bin:$PATH" user=nonrootuser
说明:
用于控制的 Unix 套接字: unix_http_server 部分创建一个安全套接字用于与 Supervisord 交互。
日志记录: 日志存储在 /var/log/supervisord.log 中,并采用轮换策略来防止磁盘使用量失控。
Celery 程序块:
命令: 使用应用程序配置运行 Celery Worker。
自动启动和自动重新启动: 确保 Celery 在部署时自动启动,并在失败时重新启动。
日志: 将 Celery 的输出记录到 /var/log/celery_worker.log 和 /var/log/celery_worker.err.log。
环境: 确保使用正确的 Python 虚拟环境。
? 提示: 使用 directory=/var/app/current 将 Supervisord 指向应用程序的部署目录,该目录会随每个 Elastic Beanstalk 部署而更新。
4。启动 Supervisord
文件:03_celery_configuration.config(续)
container_commands: 01_start_supervisor: command: "supervisord -c /etc/supervisord.conf"
说明:
容器命令: 这些命令在部署应用程序之后但在环境标记为就绪之前运行。在此处启动 Supervisord 可确保应用程序上线时您的 Celery 工作线程正在运行。
? 提示:Elastic Beanstalk 按字母顺序处理容器命令,因此请在命令前添加数字(如 01_)以控制执行顺序。
调试变得轻松:如果某些功能不起作用,请添加临时容器命令来打印环境变量或列出目录内容:
commands: 01_install_pip: command: "yum install -y python3-pip" ignoreErrors: true 02_install_supervisor: command: "/usr/bin/pip3 install supervisor" 03_create_nonroot_user: command: "useradd -r -M -s /sbin/nologin nonrootuser || true" ignoreErrors: true
检查 /var/log/eb-activity.log 中的日志。
重用通用配置:将共享配置片段存储在单独的 YAML 文件中,然后使用 include 指令将它们包含在多个 .ebextensions 文件中(非官方支持)。
此设置可确保使用 Supervisord 有效管理您的 Celery 工作线程,并与您的 Elastic Beanstalk 应用程序一起扩展。无论您是处理信息图表生成还是任何其他后台任务,这种方法都可以提供可靠性、可扩展性和安心。
以上是通过 .ebextensions 在弹性 beanstalk 上使用 Supervisord 设置 Celery Worker的详细内容。更多信息请关注PHP中文网其他相关文章!