使用 Apache Geode 异步写入的多个数据插入

Multiple data insertions using async writing with Apache Geode

我们使用 AEQ + AsyncCacheListener 将 Apache Geode 连接到 Postgres,配置为将数据写入 Postgres。在异步写入期间,我们提交要保留的事件列表,它会异步插入这些事件。假设我有两个客户端应用程序,它们调用 processEvents 进行异步写入,并且都有一些共同的事件违反了某些键。但是,在客户端调用 processEvents 之后,控制权立即返回给客户端。在这种情况下,客户如何知道是否发生了某些问题?解决这个问题的最佳做法是什么?

共同事件“违反某些密钥”是什么意思?像主键或外键约束,或者其他一些数据库约束(例如唯一性、非空值等)?

处理冲突取决于从 Geode 插入或写入后端 (Postgres) 数据库的数据的重要性和性质及其对应用程序的重要性,从需求和业务逻辑 POV。

如果 2 个(或更多)客户端应用程序写入同一个 cache/database entries/records,那么最终肯定会发生某种类型的冲突,而如何处理将取决于数据和对数据执行的操作类型。

一般来说,在违规发生的地点和时间附近处理违规(例如在 AsyncEventListener 本身内)可能更可取或理想,因为那时您应该拥有大部分必要的信息(例如 DataAccessException, 事件, 查询数据库的附加功能) 来处理这种情况。

在 AEQ 侦听器中,您可以根据应用程序确定的数据和操作采用不同的策略:

  • 第一次更新获胜(由乐观锁定强制执行)
  • 执行合并
  • 记录 [失败] 个事件
  • 覆盖值(最后一次更新为准)。
  • ...

您可以使用 Geode 将存储在 AEQ 中的事件合并为相同的密钥,这应该最小化 collisions/conflicts。

如果需要通知客户端(如 client/server 拓扑中的“客户端”),那么您可以将失败的事件写入另一个 Region 客户端注册 CQ 的地方当条目写入此(失败事件)Region 时收到通知。然后,与 CQ 关联的客户端处理程序可以采取适当的操作,例如通知最终用户、刷新然后重试操作等。

鉴于初始写入的异步性质,一旦发生违规,您只能异步响应。这与反应世界(即 onSuccess/onFailure 事件处理程序)没有什么不同。

因此,在这种情况下,我认为每个人都没有真正的“最佳实践”,而只有“建议”。例如,处理尽可能接近违规实际发生的情况,因为处理违规通常涉及随时可用的必要信息,以便就正确的行动方案做出最佳、明智的决定。

有时您可以自动执行恢复,有时您可能需要手动干预。最肯定的是,不要猜测。清楚地记录您的 application/systems(配置的)行为,何时可以处理某种情况,何时不能处理。

在这种情况下,我认为没有通用的 1 种尺寸适合所有解决方案。

我希望这能给你一些思考的想法。