Atomikos - 独特的资源名称
Atomikos - Unique resource names
我们有一个使用 spring 引导的 Java 微服务项目,并且想知道以下属性是否必须根据博客 post [在集群中的服务器中是唯一的] https://fogbugz.atomikos.com/default81d0.html?community.6.2225.7
应用基于
Spring 启动 - 1.5.12.RELEASE
Spring - 4.3.16.RELEASE
泽西岛 - 2.25.1
活动 MQ - 5.14.5
Atomikos - 3.9.3
红帽 Java - 1.8.0_191
功能包括 JDBC、JPA 和 JMS
示例服务器名称:node1、node2、node3
如果以下属性在所有服务器上都相同,如下所示,那么我相信这会导致事务恢复问题和其他可能的 XID 问题,对吗?
com.atomikos.icatch.tm_unique_name = myapp-tm-node
spring.jta.atomikos.datasource.unique-resource-name = myapp-db-node
spring.jta.atomikos.connectionfactory.unique-resource-name = myapp-jms-node
所以从技术上讲,上述属性的值在每个节点上应该是唯一的,如下所示,对吗?
com.atomikos.icatch.tm_unique_name = myapp-tm-node1
spring.jta.atomikos.datasource.unique-resource-name = myapp-db-node1
spring.jta.atomikos.connectionfactory.unique-resource-name = myapp-jms-node1
Likewise the property values ending with "node2" and "node3" on the other two servers
您不必关心名称,因为每个节点都有一个事务管理器。
只有共享 Atomikos 事务管理器时,使用它的每一方都需要一个唯一的 ID。
com.atomikos.icatch.tm_unique_name对于您启动的每个 JVM 必须是唯一的,默认情况下它基于 IP 地址。例外:如果您有一个基于 LogCloud 的弹性云应用程序,那么整个“恢复域”都有一个共享名称(即您的弹性集群应用程序的名称)。
uniqueResourceName 在每个 JVM 中必须是唯一的。它可以跨 JVM 共享 - 这通常是集群应用程序中的情况。
家伙
这是我最近遇到的事情。
简短的回答是:是的,每个 JVM 的唯一部分必须是唯一的。
推理:
在我的例子中,这个问题只在重负载下出现,而且特别难以重现。然后注意到生成的 XID(事务 ID)是基于自 EPOC 以来的纳秒数,前缀为 tm_unique_name。我们有 4 个应用服务器实例,每个实例都使用相同的 tm_unique_name。在重负载下,我们会偶尔看到交易不再有效的失败。
原因是,由于基于时间的元素,不止一个实例创建了当时具有相同 XID 的正在运行的事务。当一个提交到数据库时,具有相同 XID 的其他状态变得不确定。
解决方法:
使每个 JVM 的唯一值唯一。
我希望这对某些人有所帮助,因为这个结论花了一段时间才得出。
我们有一个使用 spring 引导的 Java 微服务项目,并且想知道以下属性是否必须根据博客 post [在集群中的服务器中是唯一的] https://fogbugz.atomikos.com/default81d0.html?community.6.2225.7
应用基于
Spring 启动 - 1.5.12.RELEASE
Spring - 4.3.16.RELEASE
泽西岛 - 2.25.1
活动 MQ - 5.14.5
Atomikos - 3.9.3
红帽 Java - 1.8.0_191
功能包括 JDBC、JPA 和 JMS
示例服务器名称:node1、node2、node3
如果以下属性在所有服务器上都相同,如下所示,那么我相信这会导致事务恢复问题和其他可能的 XID 问题,对吗?
com.atomikos.icatch.tm_unique_name = myapp-tm-node
spring.jta.atomikos.datasource.unique-resource-name = myapp-db-node
spring.jta.atomikos.connectionfactory.unique-resource-name = myapp-jms-node
所以从技术上讲,上述属性的值在每个节点上应该是唯一的,如下所示,对吗?
com.atomikos.icatch.tm_unique_name = myapp-tm-node1
spring.jta.atomikos.datasource.unique-resource-name = myapp-db-node1
spring.jta.atomikos.connectionfactory.unique-resource-name = myapp-jms-node1
Likewise the property values ending with "node2" and "node3" on the other two servers
您不必关心名称,因为每个节点都有一个事务管理器。
只有共享 Atomikos 事务管理器时,使用它的每一方都需要一个唯一的 ID。
com.atomikos.icatch.tm_unique_name对于您启动的每个 JVM 必须是唯一的,默认情况下它基于 IP 地址。例外:如果您有一个基于 LogCloud 的弹性云应用程序,那么整个“恢复域”都有一个共享名称(即您的弹性集群应用程序的名称)。
uniqueResourceName 在每个 JVM 中必须是唯一的。它可以跨 JVM 共享 - 这通常是集群应用程序中的情况。
家伙
这是我最近遇到的事情。
简短的回答是:是的,每个 JVM 的唯一部分必须是唯一的。
推理:
在我的例子中,这个问题只在重负载下出现,而且特别难以重现。然后注意到生成的 XID(事务 ID)是基于自 EPOC 以来的纳秒数,前缀为 tm_unique_name。我们有 4 个应用服务器实例,每个实例都使用相同的 tm_unique_name。在重负载下,我们会偶尔看到交易不再有效的失败。
原因是,由于基于时间的元素,不止一个实例创建了当时具有相同 XID 的正在运行的事务。当一个提交到数据库时,具有相同 XID 的其他状态变得不确定。
解决方法: 使每个 JVM 的唯一值唯一。
我希望这对某些人有所帮助,因为这个结论花了一段时间才得出。