一种RESTful数据同步方法

一种RESTful数据同步方法,rest,synchronization,Rest,Synchronization,假设在以下场景中,web应用程序通过RESTful API提供资源。许多客户端使用此API。目标是保持客户机上的数据与web应用程序同步(在两个方向上) 最简单的方法是询问API自客户端上次与API同步以来是否有任何资源发生了更改。这意味着客户机需要向API请求带有时间戳的适当资源(以查看数据是否需要更新)。在我看来,这似乎是一种在不必要的带宽消耗方面开销最小的方法 然而,我觉得这种方法在设计和责任方面有一些缺点。例如,API不必检查资源是否过期。似乎API的唯一责任应该是在请求时提供资源,而不

假设在以下场景中,web应用程序通过RESTful API提供资源。许多客户端使用此API。目标是保持客户机上的数据与web应用程序同步(在两个方向上)

最简单的方法是询问API自客户端上次与API同步以来是否有任何资源发生了更改。这意味着客户机需要向API请求带有时间戳的适当资源(以查看数据是否需要更新)。在我看来,这似乎是一种在不必要的带宽消耗方面开销最小的方法

然而,我觉得这种方法在设计和责任方面有一些缺点。例如,API不必检查资源是否过期。似乎API的唯一责任应该是在请求时提供资源,而不必处理更新方面。通过采用第二种方法,客户机每次想要更新数据时都会请求大量数据,以使其与web应用程序保持同步。换句话说,客户机将检查它返回的数据是否比本地存储的数据更新。如果此过程每隔几分钟发生一次,则可能会对系统造成重大负担


我是否正确地看到了这一点,或者我忽略了一条中间道路?

这是一个非常常见的问题,而RESTful方法可以帮助您解决它。HTTP(通常用于构建RESTful服务的应用程序协议)支持多种技术,可用于保持API客户端与服务器端的数据同步

如果客户端在HTTP响应中收到
Last Modified
E-Tag
头,它可能在将来使用该信息进行条件GET调用。这允许服务器通过
304–Not Modified
响应快速指示客户端先前存储的资源表示仍然有效且准确。这将使服务器(或者更好的是,中间代理或缓存服务器)在响应客户端请求方面尽可能高效,从而可能减少到后端数据存储的昂贵往返

如果响应包含
Last Modified
头,并且客户端希望利用它提供的性能优化,那么它们必须在对同一URI的后续GET调用中包含
If Modified-Since
指令,传递它接收到的相同时间戳值。这指示服务器仅从权威后端源获取信息,前提是它知道自那时起信息已发生更改。当然,您的服务器必须能够支持这种技术

类似的原则也适用于
E-Tag
标题。
E-Tag
是一个简单的哈希代码,表示资源在特定时间点的特定状态。如果资源以任何方式更改,其
E-Tag
值也会更改。如果客户端在响应中看到
E-Tag
,它应该在后续的GET请求中将其传递到同一URI,从而允许服务器快速确定客户端是否具有资源的最新表示形式


最后,您可能应该查看以减少客户端向服务器发出的重复GET请求的数量。本质上,诀窍是向服务器发出很长的GET请求,以监视服务器数据的更改。GET将不会返回响应,直到数据发生更改或触发很长的超时。如果是后者,客户端只需重新发出相同的长期请求,以再次监视更改。另请参阅类似的主题。这家伙说了什么(使用标准的HTTP功能),但不要使用
GET
,为此,请使用
HEAD
,因为您不关心实际数据,而是(据我所知)关心数据是否有效。如果数据无效,则执行
GET
-请求以检索新数据。^要点很好。HEAD显然更轻量级,更适合这种情况。我有一个问题:如果客户机为某种类型的记录(例如Person.findAll())发出findAll,并假设一些记录由本地数据存储返回。客户机如何知道服务器上是否有其他人员?或者反过来说,服务器如何判断客户端已经有哪些记录?同步是一个复杂的主题,特别是当涉及多个节点时。冲突、陈旧数据、删除的数据是REST约定无法直接处理的一些问题。@PanagiotisPanagi我认为您可以通过从这些记录中获取所有主键或所有散列并通过crc32进行散列来解决。