通过恢复已准备 XA 事务避免缓慢重 - Amazon MQ
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

通过恢复已准备 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() 来决定是否处理每个已准备事务。