2015-10-13 88 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功能。此功能將在交易中查找旅程(本地密鑰查找),刪除相應的預訂並增加已售座位。請注意,這個函數是冪等的,不需要全局事務。如果出現故障,可以再次運行。

希望這會有所幫助。