亚马逊网络服务现在在他们的Elastic Beanstalk中有一个工作层。但是,它让我们混淆了那些来自工人dyno时代的人。
作为比较,在Heroku中,可以为web和worker配置两个dynos(类似处理器?)。网络将适用于任何请求,并将在15秒后正常超时。因此,如果您的请求持续时间超过此要求,您的请求将会暂时超时,但本身并未终止。在这种情况下,您应该使用worker并且您的web dyno应该每分钟(可能)多次访问端点以检查是否有任何结果被带回用户。要制作工作者或网络动态,你需要的只是滑动滑块,你就可以了。有时,您可能需要一个Procfile。但没有什么花哨的东西,或者真的很难,或者令人困惑。
在AWS EBS(Elastic Beanstalk)中,从第1天开始您点击eb init,系统会询问您是标准版还是工作版。当你点击标准时,似乎没有办法让它成为工人。
在我们的情况下,工作者和标准Web位于一个应用程序下。那么,我们怎样才能为工人和标准使用EBS实例。我们的工人正在使用sidekiq和redis。请指出任何指导或帮助我们解决这个问题。
答案 0 :(得分:22)
AWS Elastic Beanstalk有两种类型的环境 - Web层和工作层。
Web层环境适用于Web应用程序 - http / https请求处理。您在负载均衡器后面获得一个或多个EC2实例。您可以根据需要获取数据库等其他资源。您可以选择您想要的平台,例如Ruby,Python,Java,Node.js,PHP,Docker。
工作线程环境用于异步消息处理。创建工作线程环境时,您没有负载均衡器。您的所有EC2实例都在自动缩放组中。所有这些实例都在运行守护程序,该守护程序轮询单个SQS队列以查找消息。当守护程序从SQS队列中提取消息时,守护程序会在localhost:80上发送HTTP Post请求。您可以配置端口,但重要的是守护程序将消息作为localhost上的HTTP请求发布。您的worker应用程序实际上是一个Web应用程序,它接收post请求并处理消息。成功处理消息后,worker守护程序期望在localhost上运行的Web应用程序返回HTTP 200 OK响应。然后,守护程序将从SQS队列中删除该消息。您可以为任何平台编写工作者应用程序,就像标准Web服务器应用程序一样 - Ruby,Python,Java,Node.js,PHP,Docker。
根据我对您的用例的理解,我建议创建两个Elastic Beanstalk环境 - 一个Standard环境和一个Worker环境。标准Web服务器接收HTTP请求并同步处理它们。此环境将相关数据放入SQS队列中。第二个环境是一个worker,在此环境中运行的守护程序会轮询此SQS队列以获取消息。您的第二个环境是一个不向互联网开放的Web应用程序。 worker守护程序将消息作为HTTP请求发布到您的工作环境。因此,您可以使用此第二个工作线程环境异步处理长时间运行的工作负载。
使用工作线程环境,您可以使用自己的队列,或者Elastic Beanstalk可以为您生成队列。您可以根据需要配置消息可见性超时,http连接等参数,也可以使用默认值。
以下是一些可能对您有用的链接:
http://aws.amazon.com/blogs/aws/background-task-handling-for-aws-elastic-beanstalk/
https://stackoverflow.com/a/23942498/161628
这符合您的要求吗?如果您还有其他问题,请与我们联系。
<强>更新强>
您需要在两个位置上传源代码 - 一次用于工作线程环境,一次用于Web服务器环境。如果有人从头开始,那么他们可能有两个独立的代码库。但我认为在你的情况下,我认为在两个环境之间共享一个代码库应该是完全没问题的。假设您的Web请求到达&#39; / register&#39;,则应用程序中的register()方法可以将消息发布到SQS队列并完成HTTP请求。现在,您的工作线程环境将轮询SQS队列,并通过本地主机上的HTTP发送消息到URL&#39; / async_register&#39;它将在您的应用程序中调用方法async_register()并执行异步处理。这两种方法可以存在于同一个源代码包中,可以由工作者和Web服务器环境共享。工作者和Web服务器采用的代码路径将不同,因此Web服务器环境将调用register(),而工作线程环境将调用async_register()方法。
另一个警告是,工作守护程序在localhost上发送的HTTP请求将包含一个HTTP标头 - &#34; User-Agent&#34;:&#34; aws-sqsd / 1.1&#34;。阅读更多here。因此,在您的Web应用程序中,您可以让一个侦听器在&#34; / register&#34;上发布请求。并且根据是否存在此标头,您可以在内部调用register()或async_register()方法。
此外,我认为如果您想在两个环境之间共享代码库,您只能在一个位置上传代码库。您的环境在逻辑上分组为应用程序。所以你可以拥有一个应用程序。您使用&#34; CreateApplicationVersion&#34;将源代码上传到此应用程序。 API调用。假设您上传了带有标签&#39; v1&#39;的应用程序版本。您现在可以在同一应用程序下创建工作线程环境和Web服务器环境。创建环境时,您需要提供一个版本以部署到您的环境中。在这种情况下,您可以将v1部署到两个环境。因此,您将为两个环境共享相同的源代码。当你有一个新版本&#34; v2&#34;。您上传此版本,然后在两个环境中执行更新,将其版本更改为&#34; v2&#34;。
可以将相同版本的源代码部署到这两种环境中。它们将在不同的EC2实例上运行,因为一个环境专用于响应Web请求,一个环境专用于响应异步Web请求(工作者)。