Elastic Beanstalk 工作者環境 - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Elastic Beanstalk 工作者環境

若您 AWS Elastic Beanstalk 應用程式執行的操作或工作流程需要長時間完成,您可將這些任務交由專屬工作者環境處理。將 Web 應用程式前端自阻擋式操作的執行程序去耦,是確保應用程式在負載下保持回應能力的常見方式。

長時間執行的任務是指會大幅增加完成請求時間的操作,例如處理圖片或影片、傳送電子郵件或產生 ZIP 封存檔。這些操作只需一或兩秒就能完成,但對於要在 500 毫秒內完成的 Web 請求而言,延遲幾秒鐘是很長的時間。

一個選項是於本機使用工作者程序,回傳成功值,以非同步方式處理任務。如果您的執行個體處理任務的速度跟得上接收到的任務,這個運作方式即有效。然而,在高負載下,執行個體可能因背景任務而導致負擔過重,無法回應高優先順序的請求。若個別使用者可產生多個任務,則負載的增加量可能與使用者增加量不相符,導致 Web 伺服器層無法有效擴展。

欲避免在本機執行的任務時間過長,您可使用您程式設計語言適用的 AWS 開發套件,將任務傳送至 Amazon Simple Queue Service (Amazon SQS) 佇列,並於另一組執行個體上執行這些任務。然後您可以設計這些工作者執行個體,只會從佇列提取有能力執行的項目,避免負擔過重。

Elastic Beanstalk 工作者環境會管理 Amazon SQS 佇列,並在為您讀取佇列的執行個體上執行協助程式程序,藉此簡化整個程序。當協助程式從佇列提取項目時,會將 HTTP POST 請求透過本機傳送至連接埠 80 上的 http://localhost/,內文則包含佇列訊息的內容。您的應用程式只需要回應 POST,執行長時間的任務。您可設定協助程式以發佈到其他路徑、使用 application/JSON 以外的 MIME 類型、連接至現有佇列或自訂連線 (最大並行工作數)、逾時和重試。

Elastic Beanstalk 工作者環境 Amazon SQS 訊息處理

透過周期性任務,您亦可將工作者協助程式設定為根據 Cron 排程排序訊息。每項周期性任務均可向不同路徑發送 POST 請求。將 YAML 檔案納入定義任務排程和路徑的原始碼,藉此啟用周期性任務。

注意

Windows Server 平台上的 .NET 不支援工作者環境。

工作者環境 SQS 協助程式

工作者環境會執行 Elastic Beanstalk 提供的協助程式程序。本協助程式會定期更新,以新增功能和修正錯誤。欲取得協助程式的最新版本,請更新至最新的平台版本

當工作者環境的應用程式回傳 200 OK 回應以確認已接收並成功處理請求,協助程式會向 Amazon SQS 佇列傳送 DeleteMessage 呼叫,藉此從佇列刪除訊息。若應用程式回傳 200 OK 之外的其他回應,則 Elastic Beanstalk 會等待已設定的 ErrorVisibilityTimeout 期間,之後將訊息放回佇列。若沒有回應,Elastic Beanstalk 會等待 InactivityTimeout 期間,之後才將訊息放回佇列,以便再次嘗試處理該訊息。

注意

Amazon SQS 佇列的屬性 (訊息順序、至少傳遞一次和訊息採樣) 可能會影響您於工作者環境設計 Web 應用程式的方式。如需詳細資訊,請參閱《Amazon Simple Queue Service 開發人員指南》中的分散式佇列屬性

Amazon SQS 會自動刪除處於佇列中的時間超過已設定 RetentionPeriod 之訊息。

協助程式會設定下列 HTTP 標頭。

HTTP 標頭

名稱 Value (值)

User-Agent

aws-sqsd

aws-sqsd/1.11

X-Aws-Sqsd-Msgid

SQS 訊息 ID,用於偵測訊息風暴 (新訊息數量異常高的情況).

X-Aws-Sqsd-Queue

SQS 佇列名稱.

X-Aws-Sqsd-First-Received-At

訊息首次接收到的 UTC 時間 (採用 ISO 8601 格式)。

X-Aws-Sqsd-Receive-Count

SQS 訊息接收計數.

X-Aws-Sqsd-Attr-message-attribute-name

指派至正在處理訊息的自訂訊息屬性。message-attribute-name 為實際訊息屬性名稱。所有字串和數字訊息屬性都會新增到標頭。二進位屬性將會予以捨棄,不會包含在標頭。

Content-Type

Mime 類型組態,預設為 application/json

無效信件佇列

Elastic Beanstalk 工作者環境支援 Amazon Simple Queue Service (Amazon SQS) 無效字母佇列。當訊息因某些原因而無法成功處理時,其他 (來源) 佇列可將該訊息傳送至無效字母佇列。無效字母佇列的主要優點,就是能夠放棄並隔離未成功處理的訊息。您可之後再分析傳送至無效字母佇列的訊息,設法判斷未成功處理的原因。

若您建立工作者環境層時指定自動產生的 Amazon SQS 佇列,則工作者環境預設會啟用無效字母佇列。若您針對工作者環境選擇現有 SQS 佇列,則必須使用 SQS 來單獨設定無效字母佇列。如需有關如何使用 SQS 來設定無效字母佇列的資訊,請參閱使用 Amazon SQS 無效字母佇列相關文章。

您無法停用無效字母佇列。無法傳送的訊息最終會傳送至無效字母佇列。然而,您可將 MaxRetries 選項設定為最大有效值 100,即可成功停用此功能。

如果未針對您工作者環境的 Amazon SQS 佇列設定無效信件佇列,Amazon SQS 會將訊息保留在佇列上,直到保留期間到期為止。如需設定保留期間的詳細資訊,請參閱設定工作者環境

注意

Elastic Beanstalk MaxRetries 選項等同於 SQS MaxReceiveCount 選項。若您的工作者環境未使用自動產生的 SQS 佇列,請於 SQS 使用 MaxReceiveCount 選項來成功停用您的無效字母佇列。如需詳細資訊,請參閱使用 Amazon SQS 無效字母佇列相關文章。

如需 SQS 訊息生命週期的詳細資訊,請參閱訊息生命週期相關文章。

周期性任務

您可於原始碼套件內名為 cron.yaml 的檔案定義周期性任務,以將工作自動定期新增至您的工作者環境佇列。

例如,下列 cron.yaml 檔案會建立兩個週期性工作。第一個每 12 小時執行一次,第二個每天在 UTC 時間下午 11:00 執行一次。

範例 cron.yaml
version: 1 cron: - name: "backup-job" url: "/backup" schedule: "0 */12 * * *" - name: "audit" url: "/audit" schedule: "0 23 * * *"

每個任務的 name (名稱) 都必須獨一無二。此 URL 則是 POST 請求會傳送的路徑,以觸發工作。排程是決定任務執行時間的 CRON 表達式

執行任務時,協助程式會向環境的 SQS 佇列發佈訊息,其標頭會指出需要執行的工作。環境中的執行個體都可提取訊息並處理工作。

注意

如果您以現有的 SQS 佇列來設定您的工作者環境,並選擇了一個 Amazon SQS FIFO 佇列,則不支援週期性任務。

Elastic Beanstalk 會使用領導者選擇,以決定哪個工作者環境佇列的執行個體應排序周期性任務。每個執行個體可寫入 Amazon DynamoDB 資料表,藉此嘗試成為領導者。第一個成功的執行個體就是領導者,而且必須持續寫入資料表以維持其領導者狀態。若領導者停止服務,另一個執行個體會快速替補。

以周期性任務而言,工作者協助程式會設定下列其他標頭。

HTTP 標頭

名稱 Value (值)

X-Aws-Sqsd-Taskname

欲執行的周期性任務名稱。

X-Aws-Sqsd-Scheduled-At

周期性任務排程的時間。

X-Aws-Sqsd-Sender-Id

訊息寄件者的 AWS 帳戶編號。

使用 Amazon CloudWatch 在工作者環境層中自動調整規模

Amazon EC2 Auto Scaling 和 CloudWatch 會共同監控工作者環境中正在執行的執行個體之 CPU 使用率。您如何設定 CPU 容量的自動調整規模限制,會決定 Auto Scaling 群組為了適當管理 Amazon SQS 佇列中的訊息傳輸量,須執行的執行個體數量。每個 EC2 執行個體會將其 CPU 使用率指標發佈至 CloudWatch 。Amazon EC2 Auto Scaling 會從 CloudWatch 擷取在工作者環境所有執行個體的平均 CPU 使用量。您必須設定閾值上下限,並根據 CPU 容量,設定欲新增或終止的執行個體數量。當 Amazon EC2 Auto Scaling 偵測到您已達到指定的 CPU 容量閾值上限,Elastic Beanstalk 會於工作者環境建立新的執行個體。當 CPU 負載降回閾值內時,將刪除這些執行個體。

注意

執行個體被終止時未處理的訊息,會回傳至佇列供仍在執行的執行個體上之協助程式處理。

您亦可使用 Elastic Beanstalk 主控台、CLI 或選項檔案,視需要設定其他 CloudWatch 警示。如需詳細資訊,請參閱搭配 Amazon CloudWatch 使用 Elastic Beanstalk建立 Auto Scaling 群組與步驟擴展政策

設定工作者環境

您可於環境管理主控台中的 Configuration (組態) 頁面編輯 Worker (工作者) 類別,藉此管理工作者環境的組態。

在 Elastic Beanstalk 主控台中修改工作者組態頁面
注意

您可以設定 URL 路徑來張貼工作者佇列中的訊息,但您無法設定 IP 連接埠。Elastic Beanstalk 一律會在連接埠 80 上張胋工作者佇列訊息。工作者環境應用程式或其 Proxy 必須聆聽連接埠 80。

欲設定工作者協助程式
  1. 開啟 Elastic Beanstalk 主控台,然後在 Regions (區域) 清單中選取您的 AWS 區域。

  2. 在導覽窗格中,選擇 Environments (環境),然後在清單中選擇您環境的名稱。

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇 Configuration (組態)

  4. Worker (工作者) 組態類別中,選擇 Edit (編輯)

Modify worker (修改工作者) 組態頁面具有下列選項。

Queue (佇列) 區段中:

  • Worker queue (工作者佇列) – 指定協助程式讀取的 Amazon SQS 佇列。如有的話,您可選擇現有佇列。若您選擇 Autogenerated queue (自動產生佇列),則 Elastic Beanstalk 會建立新的 Amazon SQS 佇列以及對應的 Worker queue URL (工作者佇列 URL)

    注意

    當您選擇 Autogenerated queue (自動產生佇列) 時,Elastic Beanstalk 建立的佇列將為標準 Amazon SQS 佇列。當您選擇現有佇列時,您可以提供標準或 FIFO Amazon SQS 佇列。請注意,如果您提供了 FIFO 佇列,則不支援週期性任務

  • Worker queue URL (工作者佇列 URL) – 若您選擇現有 Worker queue (工作者佇列),則此設定會顯示與 Amazon SQS 佇列相關聯的 URL。

Messages (訊息) 區段中:

  • HTTP path (HTTP 路徑) – 指定將自 Amazon SQS 佇列接收資料的應用程式相對路徑。此資料會插入 HTTP POST 訊息的訊息本文。預設值為 /

  • MIME type (MIME 類型) – 指出 HTTP POST 訊息使用的 MIME 類型。預設值為 application/json。然而,任何值均有效,因為您可以建立並指定自己的 MIME 類型。

  • HTTP connections (HTTP 連線) – 指定協助程式可對 Amazon EC2 執行個體內的應用程式進行並行連線的數量上限。預設值為 50。您可以指定 1100

  • Visibility timeout (可見性逾時) – 指出從 Amazon SQS 佇列內送的訊息被鎖定以進行處理的所需時間 (秒)。在設定的時間數過後,該則訊息才能在佇列中被其他協助程式再次讀取。請選擇多於您預期應用程式處理訊息的時間的值,上限為 43200 秒。

  • Error visibility timeout (錯誤可見性逾時) – 指出因明確錯誤而失敗的處理嘗試之後、Elastic Beanstalk 傳回訊息給 Amazon SQS 佇列前經過的時間 (秒)。您可以指定 043200 秒。

Advanced options (進階選項) 區段中:

  • Max retries (重試次數上限) – 指定 Elastic Beanstalk 在將訊息移往無效字母佇列前嘗試將訊息傳送至 Amazon SQS 佇列的次數上限。預設值為 10。您可以指定 1100

    注意

    Max retries (重試次數上限) 選項僅適用於設定了無效字母佇列的 Amazon SQS 佇列。對於任何未設定無效字母佇列的 Amazon SQS 佇列,Amazon SQS 會將訊息保留在該佇列中,直到 Retention period (保留期間) 選項指定的期限為止。

  • Connection timeout (連線逾時) – 指出等待成功連線到應用程式所需的時間 (以秒為單位)。預設值為 5。您可以指定 160 秒。

  • Inactivity timeout (閒置逾時) – 指出等待現有應用程式連線出現回應的所需時間 (以秒為單位)。預設值為 180。您可以指定 136000 秒。

  • Retention period (保留期間) – 指出訊息有效並主動處理所需的時間 (秒)。預設值為 345600。您可以指定 601209600 秒。

若您使用現有 Amazon SQS 佇列,則在您建立工作者環境時所進行的設定,可能會與直接在 Amazon SQS 內進行的設定衝突。例如,若您設定工作者環境所使用的 RetentionPeriod 值高於 Amazon SQS 內所設定的 MessageRetentionPeriod 值,則 Amazon SQS 會在訊息存在時間超過 MessageRetentionPeriod 值時將其刪除。

反之,若您於工作者環境設定的 RetentionPeriod 值低於 Amazon SQS 內所設定的 MessageRetentionPeriod 值,則協助程式會早 Amazon SQS 一步刪除訊息。以 VisibilityTimeout 而言,您於工作者環境設定的協助程式所設定的值,會覆寫 Amazon SQS 的 VisibilityTimeout 設定。請比較您的 Elastic Beanstalk 設定和 Amazon SQS 設定,確保訊息會適當刪除。