【问题标题】:Using Hazelcast map with LMAX disruptor - performance impact使用带有 LMAX 干扰器的 Hazelcast 地图 - 性能影响
【发布时间】:2020-01-03 12:59:55
【问题描述】:

我们需要运行订单管理器应用程序的 Active-Active 实例以实现弹性。在我们的团队中,Hazelcast 是用于跨弹性实例共享状态的首选分布式缓存。

在应用程序中,我使用单写模式和 LMAX 中断库。所以基本上我有一个繁忙的旋转主线程,它从中断器(环形缓冲区)读取传入的订单事件并快速处理它而不涉及任何阻塞操作。

现在唯一的问题是,一旦我的主线程接收到一个事件,它首先在 Hazelcast 分布式映射中执行查找(以获取当前订单的状态),并且 hazelcast 查找是一个相对较慢的操作(~5- 10 毫秒)。我想了解:

1) 如果这仍然是可以接受的,即使用 LMAX 中断器时从分布式地图中读取

2) 另外,由于 Hazelcast 调用是涉及分布式锁的线程安全的,LMAX 专家建议避免在主业务线程中使用与线程相关的锁,以便 CPU 优化的代码缓存保持热状态,因此调用 hazelcast 是否是 LMAX Disruptor 的反模式主处理线程?

有人可以在上面加 2 美分吗?

【问题讨论】:

  • 嗨@saurabh.in 你能在hazelcast分布式地图上实现disruptor吗?
  • 嗨@user3203030,是的。确实。但是,我只能将事件处理速度提高到每 txn 2-3 毫秒。正如我在上面的问题中所猜测的那样,Hazelcast 现在是阻碍者(DB 是,但当它成为瓶颈时我停止存储在 DB 中)。我们可以完全摆脱使用 Kafka 分区的 Hazelcast 集群。但是我们需要一个组件将供应商消息引导到主题内的特定 Kafka 分区,然后我的组件的每个弹性实例都可以连接到 Kafka 主题的特定分区。 Kafka 分区也支持粘性连接。
  • 哇 @saurabh.in 你能分享一个在分布式 hazelcast 对象(如地图或队列)上运行的中断器的示例代码 sn-p。会有很大的用处
  • 您好 user3203030,需要明确的是,disruptor 和 hazelcast cluster 没有直接关系。我在接收事件的入口点使用 hazelcast 作为通用分布式缓存 - 以决定哪个弹性实例应该处理它(这是一个阻塞操作,每个事件可能需要 1 到 5 毫秒!)。我使用了 hazelcast 分布式锁(尝试从具有相同事件键的所有实例写入 hazelcast 映射,并且允许任何能够插入数据的实例继续执行该事件)。 LMAX 破坏者与 hazelcast 缓存无关。

标签: java performance disruptor-pattern


【解决方案1】:

当然,我会说这是不可接受的。 IMap 不仅会无限期阻塞,还会进行网络调用。

我认为一种方法是去

  • 要么将 IMap 访问拆分到另一个线程并进行通信 在单独的环形缓冲区中使用异步事件
  • 或订阅 IMap 条目侦听器并将数据存储在内存中(如果合适的话)。

【讨论】:

  • 谢谢。我正在考虑将对 IMap 的调用移动到一个单独的线程中,并将获取的顺序与传入事件一起包装在一个 msg 中,并将其发送到我的主线程从中读取的环形缓冲区。但问题在于写入。当主线程处理完事件后,它必须更新 IMap 中订单的共享状态。因此,写入必须是同步的,以确保其他实例可以看到订单的最新状态。否则,如果下一个实例恰好处理了对应订单的下一个事件,它可以找到陈旧的订单obj。
  • @saurabh.in 不确定我是否理解正确,但很好奇你为什么要通过多个实例处理相同的订单。如果一个实例将处理给定订单的所有事件,则会更容易。您可以进行分区以实现可伸缩性。是要求还是特定设计?
  • 是的,这很好。在订单管理器的一端,我们有 kafka 代理,所以我确实确保同一个实例使用 kafka 分区获取某个订单 ID 的所有事件。另一方面,每个活动实例都有一个使用不同连接细节的并发 websocket 连接(这不是我个人的偏好)。所以在这方面,我无法控制哪个实例得到它。我可以在 IMap 中维护 orde id-> 实例,以确保相同的实例获取它,但这会在系统中添加另一个状态。
  • @saurabh.in 我仍然不确定你的架构是什么。对于主动-主动,您应该使用一些复制和领导者选择工作流程。 Afair Kafka 开箱即用。不确定 Hazelcast 是如何参与的,为什么订单流甚至需要它,它的作用是什么。
  • 订单管理应用程序在一端通过 kafka 连接到内部系统,因此我们获得了 msg 路由等的好处。但另一端使用 websocket 连接连接到供应商服务器 - 每个活动实例一个连接.来自供应商的任何事件都将复制到所有活动实例。所以我使用 hazelcast 来决定哪个实例可以处理该事件。此外,订单上下文(事件后处理)存储在 hazelcast 中,以便任何实例都可以获取它。但我明白你避免使用榛树来存储订单 ctx 的观点。
猜你喜欢
  • 2020-03-19
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多