2014-03-25 61 views
7

我想同步客戶端和服務器之間的大量項目列表。由於列表非常大,我無法在一個請求中同步它,所以我如何確保列表與同步服務的合理數量的調用同步?如何在客戶端和服務器之間同步大型列表

例如:

我要同步100.000項的列表,所以我做一個Web服務具有以下簽名

getItems(int offset,int quantity): Item[] 

的問題出現時,呼叫和呼叫,該列表之間被修改。例如:

getItems(0,100) : Return items (in the original list) [0,100) 
getItems(100,100): Return items (in the original list) [100,200) 
##### before the next call the items 0-100 are removed #### 
getItems(200,100): Return items (in the original list) [300,400) 

因此,項目[200,300]從不檢索。 (如果項目被添加的,而不是刪除,也可以檢索重複的項目。

我如何才能確保此列表的正確的同步?

+0

如果我沒有錯,最好是對列表進行JNDI引用,並獲取客戶端中的列表項。 – Keerthivasan

+0

它實際上是一個你想同步的Java數組嗎? – fge

回答

1
  1. 不時,服務應該保存不變的快照。該接口應該是getItems(long snapshotNumber, int offset,int quantity)

  2. ,以節省時間,空間和交通,而不是列表的每次修改應該形成一個快照,但每次修改應該形成一個日誌消息(例如添加項目,刪除項目的範圍),以及日誌消息應該發送到客戶端而不是完整的快照,接口可以是getModification(long snapshotNumber, int modificationNumber):Modification

+0

感謝您的回答。保留增量日誌對於我的問題是一個代價昂貴的選擇,因爲系統中的每個用戶的列表都不相同,並且頻繁更改。 snapshotNumber會幫助我 – Addev

+0

@Addev:爲什麼個人用戶的Android設備上有100,000個項目的列表? – Squonk

1

你可以讓列表在服務器端的某些參數上排序嗎?對於例如此場景的真實世界用例是在UI上的表中顯示記錄。服務器端的記錄數可能很大,因此您不希望一次獲得整個列表,而是在用戶製作的每個滾動條上獲取它們。

在這種情況下,如果列表是有序的,你會得到很多免費的東西。你的API變成getItems(long lastRecordId,int quantity)。這裏lastRecordId將是識別該特定記錄的唯一鍵。您可以使用此項來計算偏移量(在服務器端),並從該偏移位置檢索下一批,並將最後一條記錄的recordId返回給它在其下一個API調用中使用的客戶端。

您不必維護快照,也不會檢索到任何重複的記錄。在這種情況下,您提到的刪除/插入情況不會發生。但是,在某個時間點,如果您想跟蹤客戶端上添加和刪除客戶端已經看到的數據,您將不得不放棄客戶端擁有的副本並重新開始同步。

相關問題