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

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

通过恢复准备的 XA 事务避免缓慢重新启动

ActiveMQ 支持分布式 (XA) 事务。了解 ActiveMQ 如何处理 XA 事务有助于避免 Amazon MQ 中代理重启和故障转移的缓慢恢复时间

每次重启时都会重放未解析的已准备 XA 事务。如果这些问题仍未被解析,其数量将随着时间的推移而增长,从而显著增加启动代理所需的时间。这会影响重启和故障转移时间。您必须使用 commit()rollback() 解析这些事务,以便性能不会随着时间的推移而降低。

这些事务未解析的一个原因是 Apache ActiveMQ 出了问题。Amazon MQ 重启时,这可能会导致未解析的已准备事务。关于详细信息,请参阅相关的 Apache ActiveMQ defect

要监视未解析的已准备 XA 事务,您可以使用JournalFilesForFastRecoveryAmazon CloudWatch Logs 如果该数字不断增加,或者始终高于 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() 来决定是否处理每个已准备事务。