用于生成 ID 和插入对象的 Geode 事务
Geode transaction to generate ID and insert object
假设我有 3 个 PARTITIONED_REDUNDANT 区域:
- /Orders - 键是 Longs(从 /Sequences 分配的 ID),值是 Order
的实例
- /OrderLineItems - 键是 Longs(从 /Sequences 分配的 ID),值是 OrderLineItem
的实例
- /Sequences - 键是字符串(序列的名称),值是 Longs
/Sequences 区域将有许多条目,每个条目都是存储在另一个区域(例如 /Orders、/OrderLineItems、/Products 等)中的某个持久类型的 ID 序列
我想要 运行 一个 Geode 事务,它同时保存一个订单和一组 OrderLineItems。
而且,我想从 /Sequences 区域的条目中为 Order 和 OrderLineItems 分配 ID,它们的键分别为 "Orders" 和 "OrderLineItems"。这就像关系数据库中的 "auto increment" 列一样运行 - 作为事务的一部分,ID 在插入时为 allocated/assigned。
Orders 和 OrderLineItems 的插入和来自 /Sequences 区域的 ID 分配需要在事务上保持一致 - 它们都成功或一起失败。
我了解 Geode 要求在分区的情况下在事务中操作的数据位于同一位置。
显而易见的事情是将 OrderLineItems 与拥有的订单放在一起,这可以通过 PartitionResolver 来完成,returns 订单的 ID 作为路由对象。
但是,事务中仍然涉及 /Sequences 区域,我不清楚如何将该数据与 Order 和 OrderLineItems 放在一起。
/Sequences reqion 的 "Orders" 条目需要与为其生成 ID 的每个订单位于同一位置...不是吗?显然这是不可能的。
或者是否有其他/更好的方法来执行此操作(例如,更改 /Sequences 的区域类型)?
感谢您的任何建议。
根据您的 /Sequences 区域中的数据量 - 您可以将该区域设为复制区域。复制区域被认为与所有其他区域位于同一位置,因为它对所有成员都可用。
https://geode.apache.org/docs/guide/15/developing/transactions/data_location_cache_transactions.html
如果您同时创建大量条目,则此模式的成本可能很高。每个创建都将经历这些共享的全局序列。您最终可能会遇到很多事务冲突,尤其是当您通过递增上次使用的序列号来获取下一个序列号时。
作为替代方案,您可能希望将 UUID 视为您的订单和 OrderLineItems 等的键。UUID 的长度是 space 的两倍,但您可以分配一个随机 UUID,而无需任何并发创建之间的协调。
假设我有 3 个 PARTITIONED_REDUNDANT 区域:
- /Orders - 键是 Longs(从 /Sequences 分配的 ID),值是 Order 的实例
- /OrderLineItems - 键是 Longs(从 /Sequences 分配的 ID),值是 OrderLineItem 的实例
- /Sequences - 键是字符串(序列的名称),值是 Longs
/Sequences 区域将有许多条目,每个条目都是存储在另一个区域(例如 /Orders、/OrderLineItems、/Products 等)中的某个持久类型的 ID 序列
我想要 运行 一个 Geode 事务,它同时保存一个订单和一组 OrderLineItems。
而且,我想从 /Sequences 区域的条目中为 Order 和 OrderLineItems 分配 ID,它们的键分别为 "Orders" 和 "OrderLineItems"。这就像关系数据库中的 "auto increment" 列一样运行 - 作为事务的一部分,ID 在插入时为 allocated/assigned。
Orders 和 OrderLineItems 的插入和来自 /Sequences 区域的 ID 分配需要在事务上保持一致 - 它们都成功或一起失败。
我了解 Geode 要求在分区的情况下在事务中操作的数据位于同一位置。
显而易见的事情是将 OrderLineItems 与拥有的订单放在一起,这可以通过 PartitionResolver 来完成,returns 订单的 ID 作为路由对象。
但是,事务中仍然涉及 /Sequences 区域,我不清楚如何将该数据与 Order 和 OrderLineItems 放在一起。
/Sequences reqion 的 "Orders" 条目需要与为其生成 ID 的每个订单位于同一位置...不是吗?显然这是不可能的。
或者是否有其他/更好的方法来执行此操作(例如,更改 /Sequences 的区域类型)?
感谢您的任何建议。
根据您的 /Sequences 区域中的数据量 - 您可以将该区域设为复制区域。复制区域被认为与所有其他区域位于同一位置,因为它对所有成员都可用。
https://geode.apache.org/docs/guide/15/developing/transactions/data_location_cache_transactions.html
如果您同时创建大量条目,则此模式的成本可能很高。每个创建都将经历这些共享的全局序列。您最终可能会遇到很多事务冲突,尤其是当您通过递增上次使用的序列号来获取下一个序列号时。
作为替代方案,您可能希望将 UUID 视为您的订单和 OrderLineItems 等的键。UUID 的长度是 space 的两倍,但您可以分配一个随机 UUID,而无需任何并发创建之间的协调。