java - 客户端-服务器数据同步策略[Java]

标签 java algorithm design-patterns synchronization

我有一个与rest web服务通信的应用程序。我们希望实现这样一种策略:应用程序将首先请求前x个项目数,一旦全部使用,将请求下x个项目数。好吧,我的问题是在服务器中实现的解决此规范的最佳实践/模型/算法。
我们的方法A
服务器知道它总共有Z项(比如100项)
每次应用程序请求新项目时,它都会通知服务器它以前做过多少次。类似于URL/givemedata/1或URL/givemedata/6在第一个请求中,服务器将发送数据库上的前10个项目,在第二个示例中,服务器将发送50到60个项目。
问题:
如果我们在服务器上插入新数据呢?如果我们从服务器上删除数据呢?如果在第一次请求时服务器有100个项目,它会将前10个项目发送到应用程序。但如果在第二次请求时服务器有300个项目,并且我们保持相同的逻辑(占总数的10%),那么服务器将从30返回到60。我们不仅不会发送20个项目,而且将来如果从服务器上删除一些项目,我们可能会发送重复的项目。
我们的方法B
保存我们发送给每个客户的每个项目。
问题:这就是我喜欢说的懒惰的选择。因为它很容易保存我们发送给每个客户机的内容,然后从未来的请求中排除我们已经发送的内容,但是就性能而言,这可能是个大问题(想象一下,如果我们有10000个项目和20000个客户机的话)
现在,有没有一种模式或最著名的实践来处理这样的问题?

最佳答案

我有以下想法:
a)当客户机第一次调用时,服务器知道它总共有z项(比如100项)。这是通过将调用的服务器端时间戳保存在哈希表中来处理的,并将客户机id作为键。
b)每次应用程序请求新的项目时,它都会返回一组n个(比如说10个)项目作为一个集合/数组/随便什么-加上一个数字,通知客户端有多少项目尚未返回。
示例:(100项,每次10项)
客户端34呼叫服务器{服务器为20141023-10:04:34)
服务器将#3420141023-10:04:34保存在其内部状态结构中。
服务器返回:((ax,bc,rr,tt,yd,ty,a e,t4,t2,a2),90)即一组
10个元素,还有另外90个元素正在等待的通知。
客户机#34呼叫服务器(再次{现在是20141023-10:05:11
服务器)服务器返回((vx,gf,gg,yu,td,fr,we,aq,e e,lp),80)即a
一组10个元素,还有另外80个元素正在等待的通知。
有人在服务器上创建项目“u7”,时间是20141023-10:05:12
对于服务器)
客户机34呼叫服务器(再次{现在是20141023-10:05:58
服务器)服务器返回:((zx,gk,ig,tg,ed,rz,wt,a5,1e,wj),71)
即一组10个元素,另一个71
正在等待…因为它知道一个新项目是在
最初的请求已经收到。
最后,当服务器返回最后一项时,因此:
客户机#34呼叫服务器(这是第11个呼叫,因为在会话期间创建了一些其他内容{服务器是20141023-10:09:25)
服务器返回:((zq,g1,i3,t7,e7,r9,sa,ax,1x,k6),0)并从其表中删除#34。
只要您跟踪在服务器上创建给定项的时间(这可能是由于其他原因您已经做的事情),就始终可以知道客户端第一次调用是否包含结果集中的给定项。
这同样适用于删除项目,如果这对你有意义的话。
诀窍是跟踪您开始服务第一个请求的时间点,从那时起,您可以很容易地看到是否只需将时间戳与创建/删除时间戳对置就更改了集合。
当然,您可以决定现在是否要通知客户机新项的创建(这样它将得到与特定时间点的服务器状态一致的结果)。
通过使响应数据集更复杂一些,您还可以提醒客户机它在“它的一侧”的一个或多个对象已被删除,如果这在您的情况下是有意义的话。
警告:
虽然这应该为上述问题提供可行的解决方案,但请记住,实际实现必须考虑到由于排序而产生的问题。您必须根据您的情况来决定是否必须对其进行管理:如果这确实是一个问题,那么returnset结构(和客户机解释)将变得更加复杂。
问题如下:在大多数情况下,resultset(尽管是“分页的”)会有一些固有的顺序:它可以是“按价格、升序”或其他任何形式,具体取决于上下文。如果真是这样的话,你现在有一个全新的问题要处理:
如果在客户机/服务器对话期间创建新对象,则不能保证新对象不应成为已传递给客户机的部分答案的一部分(除非“排序条件”类似于“创建时间戳”)。
如果在客户机/服务器交换期间可能发生删除,则情况会更糟,因为如果已传递到客户机的对象被删除,则处理通知将更加复杂。
除非这是一个严格的要求,否则我会选择api根据第一次调用的时间戳返回一致的快照。

关于java - 客户端-服务器数据同步策略[Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359301/

相关文章:

algorithm - DPLL 算法如何工作?

algorithm - 排序数组交集的修改

java - 在这种情况下如何使用Decorator Design?

java - Spring JUnit Mockito 单元测试 Controller 指定的类是一个接口(interface)

java - 在方法体内抛出异常并在之后捕获它

java - 用户输入由空格分隔的整数

java - 清除 Java 中的 Singleton 实例

java - 上传到 AWS S3 时签名不匹配

jquery - 用于柔性匹配的双向 Quicksilver 算法

asp.net-mvc - 如何在 ASP.NET MVC 中使用 UnitOfWork 和 Repository 架构中的 IService?