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