gpt4 book ai didi

java - java 服务的多个实例中的相同事件处理

转载 作者:行者123 更新时间:2023-12-02 09:37:08 26 4
gpt4 key购买 nike

假设您在使用 java/spring/hibernate 的微服务设置中拥有同一服务的两个或多个实例。为了让这个例子更清楚一点,我们假设我们有:

  • 图书服务,用于创建/更新图书
  • book-details 服务将处理书籍的详细信息
  • tasks 服务将为已创建/更新的图书创建一些任务

我试图解决并找出处理此问题的最佳方法与以下场景相关:

  • 同一事件(例如第 1 本书已更新)被多次发出
  • book-details 服务选取book 1 Updated 更新事件,该服务在处理后将发出book 1 详细信息更新事件。这两个事件都将在tasks 服务中处理。

tasks 最终要做的是检查是否存在并为此主题创建或删除任务(在本例中为第 1 册)。这可能是一个复杂的操作,不能是原子数据库事务。

鉴于多个实例订阅同一主题,多个实例可以同时处理同一事件,从而导致完整性约束错误(由于唯一索引)。

如何妥善处理?理想的情况是让实例 #1 处理book 1,但不会阻止实例 #2 处理book 2。虽然相同的 book 1 事件正在为同一实例排队。

最佳答案

您可以在您的案例中使用分布式锁和映射。例如 Hazelcast。

锁 - https://docs.hazelcast.org/docs/3.0/manual/html/ch02s07.html .

map - https://docs.hazelcast.org/docs/3.0/manual/html/ch02.html#Map

  1. 通过事件(或事件 ID..)获取锁定 - 以防止在不同实例上执行
  2. 检查 map (例如 IMap<BookEvent, boolean wasProcessed> ),如果此事件已在另一个实例上处理 - 返回
  3. 处理您的 Activity
  4. 将事件和状态添加到 map
  5. 解锁

关于java - java 服务的多个实例中的相同事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com