微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 Apache Geode 异步写入的多个数据插入

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

解决方法

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

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

如果 2 个(或更多)客户端应用程序写入相同的缓存/数据库条目/记录,那么肯定会最终发生某种类型的冲突,并且如何处理它将取决于数据和在其上执行的操作类型数据。

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

在 AEQ Listener 内部,您可以根据应用程序确定的数据和操作采用不同的策略:

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

您可以使用 Geode 将存储在 AEQ 中的事件合并为同一个键,这样可以最大程度地减少冲突/冲突。

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

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

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

有时您可以自动恢复,有时您可能需要手动干预。绝对不要猜测。清楚地记录您的应用程序/系统(配置的)行为,何时可以处理,何时不能处理。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。