

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

# 解決 RabbitMQ 暫停的佇列同步
<a name="rabbitmq-queue-sync"></a>

在 Amazon MQ for RabbitMQ [叢集部署](rabbitmq-broker-architecture.md#rabbitmq-broker-architecture-cluster)中，發佈至每個佇列的訊息會跨三個代理程式節點進行複寫。此複寫 (稱為*鏡像*) 為 RabbitMQ 代理程式提供高可用性 (HA)。叢集部署中的佇列由一個節點上的*主要*複本和一或多個*鏡像*所組成。每個套用至鏡像佇列的作業 (包括排入佇列的訊息) 都會先套用至主要佇列，然後跨鏡像進行複寫。

例如，考量跨三個節點複寫的鏡像佇列：主要節點 (`main`) 和兩個鏡像 (`mirror-1` 和 `mirror-2`)。如果此鏡像佇列中的所有訊息都會成功傳播到所有鏡像，則會同步處理此佇列。如果節點 (`mirror-1`) 在一段時間內變得無法使用，佇列仍然可以運作，而且可以繼續將訊息排入佇列。不過，對於要同步處理的佇列，則在 `mirror-1` 無法使用時發佈至 `main` 的訊息必須複寫到 `mirror-1`。

如需鏡像的詳細資訊，請參閱 RabbitMQ 網站上的[傳統鏡像佇列](https://www.rabbitmq.com/ha.html)。

**維護與佇列同步**

在[維護時段](amazon-mq-rabbitmq-editing-broker-preferences.md#rabbitmq-edit-current-configuration-console)期間，Amazon MQ 會一次執行一個節點的所有維護工作，以確保代理程式維持運作狀態。因此，佇列可能需要在每個節點繼續操作時進行同步處理。在同步期間，需要複寫到鏡像的訊息會從對應的 Amazon Elastic Block Store (Amazon EBS) 磁碟區載入記憶體中，以便分批處理。分批處理訊息可讓佇列更快速地同步處理。

如果佇列保持簡短且訊息很小，則佇列會成功同步處理並繼續如預期般操作。不過，如果批次中的資料量接近節點的記憶體限制，節點就會引發高記憶體警示，暫停佇列同步。您可比較 `RabbitMemUsed` 與 `RabbitMqMemLimit` [CloudWatch 中的代理程式節點指標](amazon-mq-accessing-metrics.md)，以確認記憶體使用量。直到取用或刪除訊息或減少批次中的訊息數目，才能完成同步處理。

**注意**  
減少佇列同步處理批次大小可能會導致較高的複寫交易數目。

若要解決暫停的佇列同步處理，請遵循本教學中的步驟，其中示範如何套用 `ha-sync-batch-size` 政策並重新啟動佇列同步處理。

**Topics**
+ [先決條件](#rabbitmq-queue-sync-prerequisites)
+ [步驟 1：套用 `ha-sync-batch-size` 政策](#rabbitmq-queue-sync-step-1)
+ [步驟 2：重新啟動佇列同步](#rabbitmq-queue-sync-step-2)
+ [後續步驟](#rabbitmq-queue-sync-next-steps)
+ [相關資源](#rabbitmq-queue-sync-related-resources)

## 先決條件
<a name="rabbitmq-queue-sync-prerequisites"></a>

在本教學中，您必須有具備管理員許可的 Amazon MQ for RabbitMQ 代理程式使用者。您可以使用第一次建立代理程式時建立的管理員使用者，或您之後可能建立的其他使用者。下表提供必要的管理員使用者標籤和許可作為規則表達式 (regexp) 模式。


| Tags (標籤) | 讀取 regexp | 設定 regexp | 寫入 regexp | 
| --- | --- | --- | --- | 
| administrator | .\$1 | .\$1 | .\$1 | 

如需建立 RabbitMQ 使用者及管理使用者標籤和許可的詳細資訊，請參閱 [Amazon MQ for RabbitMQ 代理程式使用者](rabbitmq-simple-auth-broker-users.md#rabbitmq-basic-elements-user)。

## 步驟 1：套用 `ha-sync-batch-size` 政策
<a name="rabbitmq-queue-sync-step-1"></a>

下列程序示範如何新增適用於代理程式上建立之所有佇列的政策。您可以使用 RabbitMQ Web 主控台或 RabbitMQ 管理 API。如需詳細資訊，請參閱 RabbitMQ 網站上的[管理外掛程式](https://www.rabbitmq.com/management.html)。

**使用 RabbitMQ Web 主控台套用 `ha-sync-batch-size` 政策**

1. 登入 [Amazon MQ 主控台](https://console.aws.amazon.com/amazon-mq/)。

1. 在左側導覽窗格中選擇 **Brokers (代理程式)**。

1. 從代理程式清單中，選擇您要套用新政策的代理程式名稱。

1. 在代理程式頁面的 **Connections (連線)** 區段中，選擇 **RabbitMQ web console (RabbitMQ Web 主控台)** URL。RabbitMQ Web 主控台會在新的瀏覽器索引標籤或視窗中開啟。

1. 使用您的代理程式管理員登入憑證登入 RabbitMQ Web 主控台。

1. 在 RabbitMQ Web 主控台的頁面頂端，選擇 **Admin (管理員)**。

1. 在 **Admin (管理員)** 頁面的右側導覽窗格中，選擇 **Policies (政策)**。

1. 在 **Policies (政策)** 頁面上，您可看到代理程式目前的 **User policies (使用者政策)** 清單。在 **User policies (使用者政策)** 下方，展開 **Add / update a policy (新增/更新政策)**。
**注意**  
根據預設，使用名為 `ha-all-AWS-OWNED-DO-NOT-DELETE` 的初始代理程式政策建立 Amazon MQ for RabbitMQ 叢集。Amazon MQ 會管理此政策，以確保代理程式上的每個佇列都會複寫到所有三個節點，並自動同步佇列。

1. 若要建立新的代理程式政策，請在 **Add / update a policy (新增/更新政策)** 之下，執行下列操作：

   1. 針對 **Name (名稱)**，輸入您的政策名稱，例如 **batch-size-policy**。

   1. 針對 **Pattern (模式)**，輸入 regexp 模式 **.\$1**，以便政策符合代理程式上的所有佇列。

   1. 針對 **Apply to (套用至)**，從下拉式清單中選擇 **Exchanges and queues (交換和佇列\$1**。

   1. 針對 **Priority (優先順序)**，輸入大於套用至虛擬主機的所有其他策略的整數。您可以在任何指定的時間將一組政策定義套用至 RabbitMQ 佇列和交換。RabbitMQ 會選擇具有最高優先順序值的相符政策。如需政策優先順序及如何合併政策的詳細資訊，請參閱 RabbitMQ 伺服器文件中的[政策](https://www.rabbitmq.com/parameters.html#policies)。

   1. 針對 **Definition (定義)**，新增下列鍵值組：
      + **ha-sync-batch-size**=*100*。從下拉式清單中選擇 **Number (數字)**。
**注意**  
您可能需要根據佇列中未同步的訊息數目和大小，調整和校準 `ha-sync-batch-size` 的值。
      + **ha-mode**=**all**。從下拉式清單中選擇 **String (字串)**。
**重要**  
所有 HA 相關政策都需要 `ha-mode` 定義。省略它會導致驗證失敗。
      + **ha-sync-mode**=**automatic**。從下拉式清單中選擇 **String (字串)**。
**注意**  
所有自訂政策都需要 `ha-sync-mode` 定義。若已省略，Amazon MQ 會自動附加定義。

   1. 選擇 **Add / update policy (新增 / 更新政策)**。

1. 確認新政策出現在 **User policies (使用者政策)** 清單中。

**使用 RabbitMQ 管理 API 套用 `ha-sync-batch-size` 政策**

1. 登入 [Amazon MQ 主控台](https://console.aws.amazon.com/amazon-mq/)。

1. 在左側導覽窗格中選擇 **Brokers (代理程式)**。

1. 從代理程式清單中，選擇您要套用新政策的代理程式名稱。

1. 在代理程式頁面的 **Connections (連線)** 區段中，記下 **RabbitMQ web console (RabbitMQ Web 主控台)** URL。這是您在 HTTP 請求中使用的代理程式端點。

1. 開啟新的終端機或您所選的命令列視窗。

1. 若要建立新的代理程式政策，請輸入下列 `curl` 命令。此命令會假設預設 `/` 虛擬主機上的佇列，其編碼為 `%2F`。
**注意**  
將*使用者名稱*和*密碼*取代為您的代理管理員登入憑證。您可能需要根據佇列中未同步的訊息數目和大小，調整和校準 `ha-sync-batch-size` 的值 (*100*)。以您先前記下的 URL 取代代理程式端點。

   ```
   curl -i -u username:password -H "content-type:application/json" -XPUT \
   -d '{"pattern":".*", "priority":1, "definition":{"ha-sync-batch-size":100, "ha-mode":"all", "ha-sync-mode":"automatic"}}' \
   https://b-589c045f-f8ln-4ab0-a89c-co62e1c32ef8.mq.us-west-2.amazonaws.com/api/policies/%2F/batch-size-policy
   ```

1. 若要確認新政策已新增至代理程式的使用者政策，請輸入下列 `curl` 命令以列出所有代理程式政策。

   ```
   curl -i -u username:password https://b-589c045f-f8ln-4ab0-a89c-co62e1c32ef8.mq.us-west-2.amazonaws.com/api/policies
   ```

## 步驟 2：重新啟動佇列同步
<a name="rabbitmq-queue-sync-step-2"></a>

在將新的 `ha-sync-batch-size` 政策套用至代理程式之後，請重新啟動佇列同步處理。

**使用 RabbitMQ Web 主控台重新啟動佇列同步**
**注意**  
若要開啟 RabbitMQ Web 主控台，請參閱本教學的步驟 1 中的先前指示。

1. 在 RabbitMQ Web 主控台的頁面頂端，選擇 **Queues (佇列)**。

1. 在 **Queues (佇列)** 頁面的 **All queues (所有佇列)** 之下，找出您已暫停的佇列。在**政策**列中，您的佇列應列出您建立的新政策名稱 （例如 `batch-size-policy`)。

1. 若要以較低的批次大小重新啟動同步程序，請先取消佇列同步。然後重新啟動佇列同步。

**注意**  
如果同步處理暫停且無法順利完成，請嘗試縮減 `ha-sync-batch-size` 值，然後再次重新啟動佇列同步處理。

## 後續步驟
<a name="rabbitmq-queue-sync-next-steps"></a>
+ 佇列成功同步後，您可檢視 Amazon CloudWatch 指標 `RabbitMQMemUsed` 以監控 RabbitMQ 節點使用的記憶體數量。您也可以檢視 `RabbitMQMemLimit` 指標來監控節點的記憶體限制。如需詳細資訊，請參閱 [存取 Amazon MQ 的 CloudWatch 指標](amazon-mq-accessing-metrics.md) 及 [Amazon MQ for RabbitMQ 代理程式可用的 CloudWatch 指標](rabbitmq-logging-monitoring.md)。
+ 若要避免暫停的佇列同步處理，建議將佇列保持簡短並處理訊息。對於訊息大小較大的工作負載，我們也建議將代理程式執行個體類型升級為具有更多記憶體的較大執行個體大小。如需代理程式執行個體類型和編輯代理程式偏好設定的詳細資訊，請參閱 [編輯代理程式偏好設定](amazon-mq-rabbitmq-editing-broker-preferences.md)。
+  當您建立新的 Amazon MQ for RabbitMQ 代理程式時，Amazon MQ 會套用一組預設政策和虛擬主機限制，以最佳化代理程式效能。如果您的代理程式沒有建議的預設政策和限制，我們建議您自行建立。如需建立預設政策和虛擬主機限制的詳細資訊，請參閱 [https://docs.aws.amazon.com//amazon-mq/latest/developer-guide/rabbitmq-defaults.html](https://docs.aws.amazon.com//amazon-mq/latest/developer-guide/rabbitmq-defaults.html)。

## 相關資源
<a name="rabbitmq-queue-sync-related-resources"></a>
+  [UpdateBrokerInput](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-model-updatebrokerinput) – 使用 Amazon MQ API ，可利用此代理程式屬性更新代理程式執行個體類型。
+ [參數和政策](https://www.rabbitmq.com/parameters.html) (RabbitMQ 伺服器文件) – 進一步了解 RabbitMQ 網站上的 RabbitMQ 參數和政策。
+ [RabbitMQ 管理 HTTP API](https://pulse.mozilla.org/api/) – 進一步了解 RabbitMQ 管理 API。