Amazon Elastic Beanstalk 工作器层
Posted
技术标签:
【中文标题】Amazon Elastic Beanstalk 工作器层【英文标题】:Amazon Elastic Beanstalk Worker Tier 【发布时间】:2014-06-07 22:27:54 【问题描述】:给定一个 Web 请求,我需要做一些异步作业处理,我会定期轮询该请求,直到它完成。我有整个堆栈并在本地运行,但我无法从概念上理解如何将其移至 EBS 工作层。我在本地使用带有 Celery 和 RabbitMQ 的 Django,并成功地将 RabbitMQ 与 Amazon SQS 交换。但是,当我尝试创建一个工作层时,该层将在与 webapp 相同的 RDS 数据库中运行,但没有成功。我被困在可以排队消息但无法从队列中读取它们的地步。我需要使用这些消息对数据库执行一些昂贵的操作并为消费者准备结果。我缺少一些建筑作品吗?如何以及在哪里可以让 celery 守护进程来处理 SQS 消息?
【问题讨论】:
【参考方案1】:来自Elastic Beanstalk documentation:
当您启动 AWS Elastic Beanstalk 环境时,您可以选择环境层、平台和环境类型。您选择的环境层决定 AWS Elastic Beanstalk 是预置资源以支持处理 HTTP(S) 请求的 Web 应用程序还是处理后台处理任务的 Web 应用程序。
AWS Elastic Beanstalk 在 Auto Scaling 组中的每个 Amazon EC2 实例上安装一个守护程序,以处理工作线程环境层中的 Amazon SQS 消息。守护程序从 Amazon SQS 队列中提取数据,将其插入到 HTTP POST 请求的消息正文中,并将其发送到本地主机上用户可配置的 URL 路径。 HTTP POST 请求中消息体的内容类型默认为 application/json。
从开发人员的角度来看,在工作层上运行的应用程序只是一个普通的 Web 服务。它将接收来自实例上为您预置的 AWS Elastic Beanstalk 守护程序的调用。
请求将发送到您配置的 HTTP 路径值。这是以这样一种方式完成的,即在工作环境层中的 Web 应用程序中显示守护程序发起了请求。通过这种方式,守护程序在 Web 服务器环境层中起到与负载平衡器类似的作用。
工作环境层在处理队列中的消息后,通过本地环回将消息转发到您指定的 URL 处的 Web 应用程序。队列 URL 只能从本地主机访问。因为您只能从同一个 EC2 实例访问队列 URL,所以不需要身份验证来验证传递到该 URL 的消息。
工作环境层中的 Web 应用程序应仅在本地主机上侦听。当工作环境层中的 Web 应用程序返回 200 OK 响应以确认它已收到并成功处理了请求时,守护程序会向 SQS 队列发送 DeleteMessage 调用,以便将消息从队列中删除。 (SQS 会自动删除队列中超过配置的 RetentionPeriod 的消息。)如果应用程序返回 200 OK 以外的任何响应或在配置的 InactivityTimeout 期限内没有响应,SQS 会再次使消息在队列中可见并可用于再次尝试处理。
【讨论】:
有用的信息,但逐字取自亚马逊的文档:docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 正确!当正确答案在文档中时,我们为什么要重写所有内容? 你说得对,我应该链接原始文档:docs.aws.amazon.com/elasticbeanstalk/latest/dg/Welcome.html【参考方案2】:我目前在我的 Django 应用程序 + Celery 中使用“标准”网络层(配置了更多的进程和线程),并且我有一个 EC2 实例和一个运行 RabbitMQ 的自定义 AMI。 Celery 不完全支持 SQS,来自http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html:
SQS 运输在许多方面都需要改进 是几个未解决的错误。
老实说,我从来不明白 web worker 层应该是什么/行为,但我当前的配置似乎工作得很好(我也使用 Celery beat 来管理周期任务)。 我使用 Supervisor 对 Celery 进行了守护(Elastic Beanstalk 已经使用它来管理 apache)。
【讨论】:
以上是关于Amazon Elastic Beanstalk 工作器层的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon Elastic Beanstalk 上安装 Anaconda
Amazon Elastic Beanstalk 如何采用自定义 python 命令?
如何卸载 Amazon Elastic Beanstalk 命令行界面?