Geode事务生成ID和插入对象

问题描述 投票:1回答:1

假设我有3个PARTITIONED_REDUNDANT区域:

  • / Orders - 键是Longs(从/ Sequences分配的ID),值是Order的实例
  • / OrderLineItems - 键是Longs(从/ Sequences分配的ID),值是OrderLineItem的实例
  • / Sequences - 键是字符串(序列的名称),值是Longs

/ Sequences区域将有许多条目,每个条目是存储在另一个区域中的某些持久类型的ID序列(例如,/ Orders,/ OrderLineItems,/ Products等)。

我想运行一个Geode事务,它将一个Order和一个OrderLineItem集合在一起。

并且,我想从/ Sequences区域中的条目分配ID和OrderLineItems的ID,它们的键分别是“Orders”和“OrderLineItems”。这类似于关系数据库中的“自动增量”列 - 在插入时将ID作为事务的一部分进行分配/分配。

Orders和OrderLineItems的插入以及/ Sequences区域中ID的分配需要在事务上保持一致 - 它们一起成功或失败。

据我所知,如果区域被分区,Geode要求在事务中操作的数据位于同一位置。

显而易见的是将OrderLineItems与拥有的Order共同定位,这可以通过PartitionResolver完成,该PartitionResolver返回Order的ID作为路由对象。

但是,事务中仍然存在/ Sequences区域,我不清楚如何将这些数据与Order和OrderLineItem共同定位。

/ Sequences reqion的“Orders”条目需要与生成ID的每个Order位于同一位置......不是吗?显然这是不可能的。

或者是否有其他/更好的方法(例如,更改/ Sequences的区域类型)?

谢谢你的任何建议。

gemfire geode
1个回答
0
投票

根据/ Sequences区域中的数据量 - 您可以将该区域设为复制区域。复制区域被认为与所有其他区域位于同一位置,因为它可在所有成员上使用。

https://geode.apache.org/docs/guide/15/developing/transactions/data_location_cache_transactions.html

如果您同时创建大量条目,则此模式可能很昂贵。每个创建都将通过这些共享的全局序列。最终可能会遇到很多事务冲突,特别是如果通过递增最后使用的序列号来获取下一个序列号。

作为替代方案,您可能希望将UUID视为Orders和OrderLineItem等的键.UUID占用的空间是long的两倍,但您可以分配随机UUID而无需在并发创建之间进行任何协调。

© www.soinside.com 2019 - 2024. All rights reserved.