双节点Hazelcast集群随机出现事务提交极慢问题咨询
Hazelcast 2节点XA事务提交随机5秒延迟问题解决方案
根因说明
你遇到的固定5秒延迟是Hazelcast 4.2.2版本的已知缺陷,两阶段提交过程中,事务协调者等待副本节点事务日志复制ACK的默认重试间隔为5秒:当节点间事务日志复制丢包、副本节点事务处理线程阻塞时,协调者不会立即重试,会等待整整5秒才执行后续逻辑,高负载下线程阻塞、网络丢包概率更高,所以问题出现更频繁,单节点无需跨节点复制事务日志,因此不会复现。
修复方案
方案1:版本升级(优先推荐)
直接升级到Hazelcast 4.2.8或5.1.x以上稳定版本即可,该版本已经修复了两个直接相关的缺陷:
- XA事务prepare阶段副本响应丢失后,协调者错误进入5秒固定等待逻辑
- 事务日志复制时未复用现有连接,偶发建连超时触发5秒等待
方案2:临时配置调整(暂时无法升级时使用)
你现有配置未覆盖事务相关参数,需要新增以下配置项:
// 事务两阶段提交副本ACK超时时间,默认5000ms,调整为100ms超时即重试 properties.setProperty("hazelcast.transaction.two-phase.ack.timeout.millis", "100"); // 开启超时自动回滚,避免死事务占用资源 properties.setProperty("hazelcast.transaction.rollback.on.timeout", "true"); // 调整事务重试次数,避免单次网络波动导致长延迟 properties.setProperty("hazelcast.transaction.retry.count", "3"); // 增加事务专用线程数,避免高负载下事务请求被其他操作阻塞 properties.setProperty("hazelcast.transaction.thread.count", "24"); // 禁用事务日志同步刷盘,XA场景下数据库已提供持久化保障,无需Hazelcast重复刷盘 properties.setProperty("hazelcast.transaction.durable.write.queued", "true");
验证步骤
- 问题复现时查看慢操作日志,确认慢操作类型为
TwoPhaseCommitOperation即可匹配上述根因 - 排查两节点间网络状态,确认无大于10ms的偶发抖动,网络抖动会大幅提升问题触发概率
- 低负载下也出现问题时,抓取节点线程栈,确认是否事务线程被其他CPU密集型操作占满,适当调高事务线程数即可解决
内容的提问来源于stack exchange,提问作者simonC
相关产品推荐
相关产品推荐

