涉及 JMS、数据库和 Hazelcast 分布式集合的 XA 事务
XA transaction involving JMS, Database and Hazelcast distributed collection
我们的一个应用程序预计很快就会有显着的负载增加,我正在评估 Hazelcast 分布式集合以帮助我们消除一些现有的数据库瓶颈。
我们的应用程序的多个实例 运行 在一组不同的主机上进行水平缩放。应用程序的不同模块被部署到多个 Webshere 应用程序服务器,以将负载分散到多个 JVM。一个典型的工作流程包括:
- 消息从 Webshere MQ 队列推送到 MDB
- MDB解析消息并保存到数据库
- MDB 从消息中提取一个识别相关消息的特殊密钥,并将该密钥插入一个特殊的锁中 table 因此,一旦这样的密钥被节点拾取,它将处理该节点上的所有相关消息节点。按顺序处理所有相关消息对我们的应用程序至关重要。
这个 table 是我们想要用 hazelcast 阻塞队列替换的东西之一。
- 同一 MDB 在 Webshere MQ 主题中发送通知,通知其他 JVM 工作已到达以进行进一步处理。 我们考虑将此主题替换为 Hazelcast 主题,但这是可选的
以上所有流程都发生在同一个 XA 事务中,因此一旦其他 JVM 收到通知,就可以确定锁定 table 条目可供提取。
接收 JVM 收到通知后将跳转到锁定 table 尝试锁定密钥并处理属于该密钥的所有消息。消息源源不断,因此所有 运行 JVM 始终准备好密钥。
我们在压力测试中注意到,由于多个线程试图同时锁定密钥,数据库开始承受越来越大的压力,影响了我们应用程序的整体性能。
有几个这样的信号量 table 控制顺序处理,这就是我们考虑移动到内存数据网格的原因。
以上就是我们的故事。从理论上讲,这似乎是个好主意,我希望实现性能提升不一定是因为减少网络流量,因为这无论如何都会发生,但至少是通过将压力分散到多个资源上。
我尝试 google 关于如何设置 JMS、DB 和 Hazelcast 集合参与的 XA 跨国上下文。不幸的是,关于 XA 的 Hazelcast 文档只有几行代码,仅此而已。我相信我不是唯一面临这个问题的人,我希望能在这里提供一些意见。不需要有效的解决方案,只需 link 一个很好的例子或更多如何提示文档以让我感动就足够了。
提前谢谢你
我建议你看一下XA测试类:
https://github.com/hazelcast/hazelcast/tree/master/hazelcast/src/test/java/com/hazelcast/xa
此外,这里还有一些代码示例:
https://github.com/hazelcast/hazelcast-code-samples/tree/master/transactions
如果您使用 JTXA 和 Hazelcast 资源适配器 (github.com/hazelcast/hazelcast-ra),Hazelcast 将成为整个 JTXA 事务的一部分,可以包括任何类型的事务。
我们的一个应用程序预计很快就会有显着的负载增加,我正在评估 Hazelcast 分布式集合以帮助我们消除一些现有的数据库瓶颈。
我们的应用程序的多个实例 运行 在一组不同的主机上进行水平缩放。应用程序的不同模块被部署到多个 Webshere 应用程序服务器,以将负载分散到多个 JVM。一个典型的工作流程包括:
- 消息从 Webshere MQ 队列推送到 MDB
- MDB解析消息并保存到数据库
- MDB 从消息中提取一个识别相关消息的特殊密钥,并将该密钥插入一个特殊的锁中 table 因此,一旦这样的密钥被节点拾取,它将处理该节点上的所有相关消息节点。按顺序处理所有相关消息对我们的应用程序至关重要。 这个 table 是我们想要用 hazelcast 阻塞队列替换的东西之一。
- 同一 MDB 在 Webshere MQ 主题中发送通知,通知其他 JVM 工作已到达以进行进一步处理。 我们考虑将此主题替换为 Hazelcast 主题,但这是可选的
以上所有流程都发生在同一个 XA 事务中,因此一旦其他 JVM 收到通知,就可以确定锁定 table 条目可供提取。
接收 JVM 收到通知后将跳转到锁定 table 尝试锁定密钥并处理属于该密钥的所有消息。消息源源不断,因此所有 运行 JVM 始终准备好密钥。
我们在压力测试中注意到,由于多个线程试图同时锁定密钥,数据库开始承受越来越大的压力,影响了我们应用程序的整体性能。
有几个这样的信号量 table 控制顺序处理,这就是我们考虑移动到内存数据网格的原因。
以上就是我们的故事。从理论上讲,这似乎是个好主意,我希望实现性能提升不一定是因为减少网络流量,因为这无论如何都会发生,但至少是通过将压力分散到多个资源上。
我尝试 google 关于如何设置 JMS、DB 和 Hazelcast 集合参与的 XA 跨国上下文。不幸的是,关于 XA 的 Hazelcast 文档只有几行代码,仅此而已。我相信我不是唯一面临这个问题的人,我希望能在这里提供一些意见。不需要有效的解决方案,只需 link 一个很好的例子或更多如何提示文档以让我感动就足够了。
提前谢谢你
我建议你看一下XA测试类:
https://github.com/hazelcast/hazelcast/tree/master/hazelcast/src/test/java/com/hazelcast/xa
此外,这里还有一些代码示例: https://github.com/hazelcast/hazelcast-code-samples/tree/master/transactions
如果您使用 JTXA 和 Hazelcast 资源适配器 (github.com/hazelcast/hazelcast-ra),Hazelcast 将成为整个 JTXA 事务的一部分,可以包括任何类型的事务。