在GemFire留档和论坛中,我们通常会看到客户、订单、订单项目和分区的用例,这些区域的订单和订单项目与客户位于同一位置。
我们的用例有一个容量区域,它包含大量数据并包含Inventory信息,需要进行分区。它包含每个火车容量的详细信息。当我们进行预订时,假设一个人从A点前往B,他可能会选择一条路线,例如A-C他乘坐火车1,C-B他乘坐火车2
因此,当从库存中预订时-对于train1和train2,容量必须更新(在这种情况下减少)。
考虑到容量是一个分区区域,train1条目和train2条目可以在单独的数据节点上。这里我们不能对火车信息进行任何类型的数据协同定位。
我们如何在单个事务中更新train1和train2数据而不会得到TransactionDataNotColocated异常?
分区容量区域是可能的还是不可能的?
枢轴网站提到了印度铁路和中国铁路的案例研究,所以这样的用例可能是一个非常常见的用例?
谢啦
我在航空公司库存系统中遇到过类似的情况。简而言之,你将无法使用交易来跨越整个购买,因为没有分区方案来将作为任何可能旅程一部分的火车放在一起。
你必须发挥创造力。我在下面概述了一个解决方案。它可能完全满足你的需求,也可能不完全满足你的需求,但它至少应该让你知道如何从GemFire提供的部分中构建一个解决方案。
一种方法是使用“预订座位”的概念。“预订座位”是指可能已经售出的座位——它的“不确定”。假设“旅程”是在特定日期从地点A到地点B的一列火车。这将非常大,并将存储在一个分区区域中。每个火车旅程都将携带一个容量、售出的座位和预订列表。每个预订都包含预订的时间戳和唯一的购买标识符。
在任何给定的时间,火车旅行的可用容量是初始容量-已售座位-预订。大小()
售卖行程时,其中可能包含多个行程
对于旅程的每一段,开始txn检索train-旅程检查可用容量(参见上面的公式),如果容量
如果您成功地保留了每次旅行的容量,请完成销售并在“最近购买”区域中记录唯一的购买标识符,以及旅行中所有旅程的密钥列表。如果旅行中的任何旅程没有容量,您告诉用户旅行不可用。
这种算法永远不会超卖,但可以保留与完成购买不对应的预订。这可能是因为旅行中的旅程不可用或失败。
拼图的最后一块是几个后台作业,用于处理预订并将其转换为出售的座位。一个作业只需定期通过所有火车旅行,并从列表中删除过期的预订。请注意,这可以以完全分布式的方式完成,无需节点内协调。
另一项工作将处理最近的购买。您将遍历最近的购买区域。对于每次最近的购买,针对旅程区域运行一个onRegion Function,其中包含一个由旅程密钥列表组成的过滤器。此Function将在事务中找到旅程(本地密钥查找),删除相应的预订并增加已售席位。请注意,此Function是幂等的,不需要全局事务。如果出现故障,可以再次运行。
希望这有帮助。