透過復原備妥的 XA 交易避免緩慢重新啟動 - Amazon MQ

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

透過復原備妥的 XA 交易避免緩慢重新啟動

ActiveMQ 支援分散式 (XA) 交易。了解 ActiveMQ 如何處理 XA 交易,有助於避免在 Amazon MQ 進行代理程式重新啟動和容錯移轉時出現緩慢的復原時間

每次重新啟動,都會重新播放未解決的備妥 XA 交易。如果這些交易仍未解決,則其數量會隨著時間增長,大幅增加啟動代理程式所需的時間。這會影響重新啟動和容錯移轉的時間。您必須使用 commit()rollback() 解決這些交易,讓效能不會隨著時間降低。

若要監控未解決的備妥 XA 交易,您可以使用 Amazon CloudWatch Logs 中的 JournalFilesForFastRecovery 指標。如果此數量持續增加,或是一直高於 1,您應該使用類似以下範例的程式碼來復原未解決的交易。如需更多詳細資訊,請參閱 Quotas in Amazon MQ

以下範例程式碼逐步解說備妥 XA 交易,並使用 rollback() 關閉它們。

import org.apache.activemq.ActiveMQXAConnectionFactory; import javax.jms.XAConnection; import javax.jms.XASession; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; public class RecoverXaTransactions { private static final ActiveMQXAConnectionFactory ACTIVE_MQ_CONNECTION_FACTORY; final static String WIRE_LEVEL_ENDPOINT = "tcp://localhost:61616";; static { final String activeMqUsername = "MyUsername123"; final String activeMqPassword = "MyPassword456"; ACTIVE_MQ_CONNECTION_FACTORY = new ActiveMQXAConnectionFactory(activeMqUsername, activeMqPassword, WIRE_LEVEL_ENDPOINT); ACTIVE_MQ_CONNECTION_FACTORY.setUserName(activeMqUsername); ACTIVE_MQ_CONNECTION_FACTORY.setPassword(activeMqPassword); } public static void main(String[] args) { try { final XAConnection connection = ACTIVE_MQ_CONNECTION_FACTORY.createXAConnection(); XASession xaSession = connection.createXASession(); XAResource xaRes = xaSession.getXAResource(); for (Xid id : xaRes.recover(XAResource.TMENDRSCAN)) { xaRes.rollback(id); } connection.close(); } catch (Exception e) { } } }

在真實世界案例中,您可以針對 XA 交易管理員檢查您的備妥 XA 交易。然後,您可以決定是否要使用 rollback()commit() 來處理每個備妥交易。