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

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) 永远不会被检索。 (如果添加而不是删除项目,则也可能检索重复项目。

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


如果我没错的话,最好在客户端中创建一个JNDI引用到列表并获取列表项。 - Keerthivasan
你是否真的想要同步一个Java数组? - fge
2个回答

1
  1. 服务应该定期保存不可变的快照。接口应为getItems(long snapshotNumber, int offset,int quantity)

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


谢谢你的回答。对于我的问题来说,保留增量日志是一个昂贵的选择,因为系统中每个用户的列表都不同且经常更改。快照编号将对我有所帮助。 - Addev
@Addev:为什么个人用户会在他们的Android设备上有一个包含10万个项目的列表? - Squonk

1
你能否使列表在服务器端按某个参数排序?例如,这种情况的真实用例是在UI上显示表中的记录。服务器端的记录数量可能非常庞大,因此您不希望一次获取整个列表,而是在每次用户滚动时获取它们。
在这种情况下,如果列表已排序,则可以免费获得很多东西。您的API将变为getItems(long lastRecordId,int quantity)。这里lastRecordId将是唯一标识该特定记录的键。您使用此键计算偏移量(在服务器端)并从此偏移位置检索下一批并返回客户端的recordId,客户端在其下一个API调用中使用它。
您无需维护快照,并且不会检索到任何重复记录。在这种情况下,您提到的删除/插入情况不会发生。但是,在某个时间点上,如果您想要跟踪客户端已经看到的数据的添加和删除,则必须丢弃客户端拥有的副本并重新开始同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接