【发布时间】: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