2015-10-13 89 views
0

在GemFire文档和论坛中,我们通常会看到客户,订单,订单项目以及在这些区域使用与客户共存的订单和订单项目进行分区的用例。Gemfire分区:交易问题

我们的用例有一个容量区域,容纳大量数据并保存库存信息并需要进行分区。它包含每个列车容量的详细信息。 当我们做一个假设预约一个人从点A到B,他可能会选择诸如AC路线 - B 其中Ac他的推移TRAIN1和CB他的推移TRAIN2

所以预订时是从库存中完成 - 对于train1和train2,容量必须更新(在这种情况下减少)。

考虑到Capacity作为一个分区,train1入口和train2入口可以在单独的数据节点上。在这里,我们不能在火车信息上进行任何类型的数据共同定位。

如何在单个事务中更新train1和train2数据而不会收到TransactionDataNotColocated异常?

这是可能的还是不可能分区容量区域?

关键站点提到印度铁路,中国铁路的案例研究,所以这样的用例可能是非常普遍的一个?

谢谢

回答

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功能。此功能将在交易中查找旅程(本地密钥查找),删除相应的预订并增加已售座位。请注意,这个函数是幂等的,不需要全局事务。如果出现故障,可以再次运行。

希望这会有所帮助。