如何在客户端和服务器之间同步大型列表

时间:2014-03-25 13:13:56

标签: java android algorithm web-services

我想在客户端和服务器之间同步大量项目。由于列表非常大,我无法在单个请求中同步它,因此,如何确保列表与同步服务的合理调用量同步?

例如:

我想要一个列表与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]。 (如果添加项目而不是删除项目,也可以检索重复项目。

如何确保此列表的正确同步?

2 个答案:

答案 0 :(得分:1)

  1. 服务有时会保存不可变的快照。界面应为getItems(long snapshotNumber, int offset,int quantity)

  2. 为了节省时间,空间和流量,并非每次修改列表都应形成快照,但每次修改都应形成一条日志消息(例如添加项目,删除项目范围),并且日志消息应该被发送到客户端而不是完整快照。界面可以是getModification(long snapshotNumber, int modificationNumber):Modification

答案 1 :(得分:1)

您可以在服务器端的某些参数上订购列表吗?对于例如这个场景的真实用例是在UI上的表中显示记录。服务器端的记录数量可能很大,因此您不希望立即获取整个列表,而是在用户创建的每个滚动上获取它们。

在这种情况下,如果订购了清单,您可以免费获得很多东西。您的API变为getItems(long lastRecordId,int quantity)。这里lastRecordId将是标识该特定记录的唯一密钥。您可以使用此密钥计算偏移量(在服务器端)并从此偏移位置检索下一批,并将最后一条记录的recordId返回给它在下一次API调用中使用的客户端。

您不必维护快照,也不会检索到任何重复记录。在这种情况下,在删除/插入的情况下,您提到的方案不会发生。但是在某个时间点,如果您想要跟踪客户端已经看到的数据的客户端添加和删除,则必须丢弃客户端具有的副本并重新开始同步。