本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
確保有效的 Amazon MQ 效能
以下設計模式可以提升 Amazon MQ 代理程式的效益和效能。
對於具有緩慢消費者的佇列,停用並行存放和分派
根據預設,Amazon MQ 會針對具有快速消費者的佇列而最佳化:
-
如果消費者能夠跟得上生產者產生訊息的速率,則會將其視為快速消費者。
-
如果佇列建置未認可訊息的後端記錄,這可能造成生產者傳輸量降低,則消費者會被視為緩慢。
若要指示 Amazon MQ 針對具有緩慢消費者的佇列來最佳化,請將 concurrentStoreAndDispatchQueues
屬性設定為 false
。如需範例組態,請參閱 concurrentStoreAndDispatchQueues。
為最佳傳輸量選擇正確的代理程式執行個體類型
代理程式執行個體類型的訊息傳輸量取決於應用程式的使用案例和以下因素:
-
在持久性模式中使用 ActiveMQ
-
訊息大小
-
生產者和消費者的數目
-
目的地的數目
了解訊息大小、延遲和輸送量之間的關係
根據您的使用案例,較大的代理程式執行個體類型可能不一定提高系統傳輸量。當 ActiveMQ 將訊息寫入到耐久性儲存時,訊息的大小決定系統的限制因素:
-
如果您的訊息小於 100 KB,則持久性儲存延遲是限制因素。
-
如果您的訊息大於 100 KB,則持久性儲存傳輸量是限制因素。
當您在持久性模式下使用 ActiveMQ 時,若有少數消費者或消費者是緩慢的,則通常會寫入至儲存。在非持久性模式下,如果代理程式執行個體的堆積記憶體已滿,則也會使用緩慢消費者寫入至儲存。
若要判斷您應用程式的最佳代理程式執行個體類型,我們建議測試不同的代理程式執行個體類型。如需詳細資訊,請參閱 Broker instance types,亦可參閱使用 JMS 基準量測 Amazon MQ 的輸送量
大型代理程式執行個體類型的使用案例
當大型代理程式執行個體類型提高輸送量時,有三種常見的使用案例:
-
非持久性模式 – 當您的應用程式對在代理程式執行個體容錯移轉期間失去訊息不太敏感時 (例如,當播放運動比分時),您通常可以使用 ActiveMQ 的非持久性模式。在此模式下,僅在代理程式執行個體的堆積記憶體已滿時,ActiveMQ 才會將訊息寫入至持久性儲存。使用非持久性模式的系統可受益於大型代理程式執行個體類型上提供的更高記憶體數量、更快 CPU,以及更快網路。
-
快速消費者 – 當作用中消費者可用,且 concurrentStoreAndDispatchQueues 旗標已啟用時,ActiveMQ 可讓訊息直接從生產者移到消費者,無需將訊息傳送到儲存 (甚至在持久性模式下)。如果您的應用程式可以快速耗用訊息 (或如果您可以設計讓消費者這樣做),則您的應用程式可受益於大型代理程式執行個體類型。若要讓您的應用程式更快耗用訊息,請將消費者執行緒新增到您的應用程式執行個體,或垂直或水平擴增您的應用程式執行個體。
-
批次交易 – 當您使用持久性模式,並且為每個交易傳送多則訊息時,您可以使用大型代理程式執行個體類型來達到更高的整體訊息輸送量。如需詳細資訊,請參閱 Apache ActiveMQ 文件中的我是否應使用交易
。
為最佳輸送量選擇正確的代理程式儲存類型
若要利用跨多個可用區域的高耐久性和複寫功能,請使用 Amazon EFS。若要利用低延遲和高輸送量,請使用 Amazon EBS。如需更多詳細資訊,請參閱 Storage。
正確地設定您的代理程式網路
當您建立代理程式網路時,請為您的應用程式正確地設定此項目:
-
啟用持久性模式 – 由於 (相對於同儕) 每個代理程式執行個體就像生產者或使用者,因此代理程式的網路並不提供分散式複寫的訊息。第一個做為使用者的代理程式,會接收訊息,並且將訊息儲存以持久保留。此代理程式會傳送認可訊息給生產者,並將該訊息轉傳給下一個代理程式。當第二個代理程式認可訊息的持久性時,第一個代理程式會刪除該訊息。
如果已停用持久性模式,則第一個代理程式會發出認可訊息給生產者,而不會將訊息持久儲存。如需詳細資訊,請參閱 Apache ActiveMQ 文件中的 Replicated Message Store (複製訊息存放)
和 What is the difference between persistent and non-persistent delivery? (持久性與非持久性傳送的不同之處) 。 -
不停用代理程式執行個體的建議訊息 – 如需詳細資訊,請參閱 Apache ActiveMQ 文件中的 Advisory Message (建議訊息)
。 -
不使用多點傳送代理程式探索 – Amazon MQ 不支援使用多點傳送來探索代理程式。如需詳細資訊,請參閱 Apache ActiveMQ 文件中的 What is the difference between discovery, multicast, and zeroconf? (探索、多點傳送和 zeroconf 的不同之處)
。