在GemFire文档和论坛中,我们通常会看到客户,订单,订单商品和分区在这些地区完成的用例,其中订单和订单商品与客户位于同一位置。
我们的用例有一个容量区域,它包含大量数据并保存库存信息并需要进行分区。它包含每个列车容量的详细信息。 当我们进行预订时,假设一个人从A点到B点,他可能会选择一条路线,如A - C - B. A-C他乘火车1和C-B去火车2
因此,当从库存完成预订时 - 对于train1和train2,必须更新容量(在这种情况下减少)。
将容量视为分区区域,train1条目和train2条目可以位于单独的数据节点上。在这里,我们不能在列车信息上进行任何类型的数据共址。
如何在单个事务中更新train1和train2数据而不会获得TransactionDataNotColocated异常?
这是可能的还是分区容量区域不可能?
Pivotal网站提到印度铁路,中国铁路的案例研究,所以这样的用例可能是一个非常普遍的用途?
由于
答案 0 :(得分:1)
我遇到过这样的航空公司库存系统。简短的回答是,您将无法使用交易来跨越整个购买,因为没有分区方案可以将列车作为任何可能旅程的一部分。
你必须要有创意。我在下面概述了一个解决方案。它可能会或可能不会完全满足您的需求,但至少应该让您了解如何从GemFire提供的解决方案中构建解决方案。
这样做的一种方法是使用“保留席位”的想法。 “保留座位”是可能已售出的 - 其“有疑问”。让“旅程”成为在特定日期从A位置到B的一列火车。这将非常大并将存储在分区区域中。每次火车旅行都会有一个容量,出售的座位和一系列预订。每个预订都包含预订的时间戳和唯一的购买标识符。
在任何时候,火车旅程的可用容量是初始容量 - 已售出的座位 - reservations.size()
出售旅行时,可能包含多次旅程
for each leg of the journey
start txn
retrieve train-journey
check available capacity (see formula above)
if capacity > 0 add a reservation to the list
commit
如果您在每次旅程中成功保留了容量,请完成销售并在“最近购买”区域记录唯一购买标识符,以及旅行中所有旅程的钥匙列表。如果旅行中的任何旅程没有容量,您告诉用户旅行不可用。
此算法从不会过度使用,但可以保留与完成购买不对应的预订。这可能发生,因为旅行的旅程不可用或因为失败。
最后一个难题是处理预订并将其转换为座位销售的几个后台工作。一项工作只是定期通过所有列车行程,并从列表中删除过期的预订。注意,这可以以完全分布的方式完成,而没有节点内协调。
另一项工作将涉及最近的购买。您可以遍历最近的购买区域。对于每次最近的购买,使用由旅程密钥列表组成的过滤器对旅程区域运行onRegion功能。此功能将在交易中查找旅程(本地密钥查找),删除相应的预订并增加已售出的座位。请注意,此函数是幂等的,不需要全局事务。如果出现故障,可以再次运行。
希望这有帮助。