簡體   English   中英

AWS Elastic Beanstalk中的worker“dyno”

[英]Worker “dyno” in AWS Elastic Beanstalk

Amazon Web Service現在在Elastic Beanstalk中有一個工作層。 但是,它讓我們混淆了那些來自工人dyno時代的人。

作為比較,在Heroku中,可以為web和worker配置兩個dynos(類似處理器?)。 網絡將適用於任何請求,並將在15秒后正常超時。 因此,如果您的請求持續時間超過此要求,您的請求將會暫時超時,但本身並未終止。 在這種情況下,您應該使用worker並且您的web dyno應該每分鍾(可能)多次訪問端點以檢查是否有任何結果被帶回用戶。 要制作工作者或網絡動態,你需要的只是滑動滑塊,你就可以了。 有時,您可能需要一個Procfile。 但是沒有什么花哨的東西,或者說是非常困難的東西,或者令人困惑的東西。

在AWS EBS(Elastic Beanstalk)中,從第1天開始您點擊eb init,系統會詢問您是標准版還是工作版。 當你點擊標准時,似乎沒有辦法讓它成為工人。

在我們的情況下,工作者和標准Web位於一個應用程序下。 那么,我們怎樣才能為工人和標准使用EBS實例。 我們的工人正在使用sidekiq和redis。 請指出任何指導或幫助我們解決此問題。

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/

http://blogs.aws.amazon.com/application-management/post/Tx1Y8QSQRL1KQZC/Elastic-Beanstalk-Video-Tutorial-Worker-Tier

https://stackoverflow.com/a/23942498/161628

這符合您的要求嗎? 如果您有其他問題,請與我們聯系。

更新

您需要在兩個位置上傳源代碼 - 一次用於工作線程環境,一次用於Web服務器環境。 如果有人從頭開始,那么他們可能有兩個獨立的代碼庫。 但我認為在你的情況下,我認為在兩個環境之間共享一個代碼庫應該是完全沒問題的。 假設您的Web請求到達'/ register',那么應用程序中的register()方法可以將消息發布到SQS隊列並完成HTTP請求。 現在,您的工作線程環境將輪詢SQS隊列,並通過本地主機上的HTTP發送消息到URL“/ async_register”,它將在您的應用程序中調用方法async_register()並執行異步處理。 這兩種方法可以存在於同一個源代碼包中,可以由工作者和Web服務器環境共享。 worker和web服務器采用的代碼路徑將不同,因此Web服務器環境將調用register(),而工作線程環境將調用async_register()方法。

另一個警告是,工作守護程序在localhost上發送的HTTP請求將包含HTTP標頭 - “User-Agent”:“aws-sqsd / 1.1”。 在這里閱讀更多。 因此,在您的Web應用程序中,您可以使用單個偵聽器在“/ register”上發布請求,並根據是否存在此標頭,在內部調用register()或async_register()方法。

另外我想如果你想在兩個環境之間共享代碼庫,你可以只在一個地方上傳代碼庫。 您的環境在邏輯上分組為應用程序。 所以你可以擁有一個應用程序。 您使用“CreateApplicationVersion”API調用將源代碼上載到此應用程序。 假設您上傳了標簽為“v1”的應用程序版本。 您現在可以在同一應用程序下創建工作線程環境和Web服務器環境。 創建環境時,您需要提供一個版本以部署到您的環境中。 在這種情況下,您可以將v1部署到兩個環境。 因此,您將為兩個環境共享相同的源代碼。 當你有一個新版本“v2”。 您上載此版本,然后在兩個環境中將其版本更改為“v2”時執行更新。

可以將相同版本的源代碼部署到兩個環境中。 它們將在不同的EC2實例上運行,因為一個環境專用於響應Web請求,一個環境專用於響應異步Web請求(工作者)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM