我是一个客户端,比如clientA,我需要每隔15分钟定期调用一个服务器,比如serverA,以从serverA获得新的更新。
ServerA只能公开API,该API引入两个参数-开始时间和结束时间,并返回新创建的帐户详细信息列表。
示例serverA公开:REST GET Api看起来像这个
http://somedomainname.com/getAccounts?startTime={say currentTime-15minutes}&endTime={say currentTime}
响应:
{[
123,
456,
789
....
]} // List of account numbers that was created in serverA between supplied start time and end time.
作为客户端A,我必须定期调用上面的API(比如每15分钟调用一次(,并将更新存储在我的客户端数据库中。设计我的客户端系统的最佳方法是什么?调用serverA API,检索更新并存储在我的客户端数据库中,考虑容错,例如如果serverA因任何原因关闭或客户端本身关闭或任何其他未预期的错误情况。我还想在重试机制中避免重复调用。
如果能听到你对此的意见,那将是一件很好的事情。我的客户端A将使用Spring Boot框架用Java语言编写
根据我的经验,如果可以在系统之间同步数据,最好使用推送而不是拉取方法。从API获取更新,尤其是由多个客户端获取更新,可能会迅速导致API性能问题。相反,推送方式的规模更好——任何数量的客户端都可以订阅更新,更新的发布者可以在方便的时间发送更新。
但回到你的问题。无论如何,你需要某种锚来跟踪上次成功检索更新的时间。在非常简单的场景中,用一个字段(例如LastSuccesfullAccountUpdateCallDatetime
(存储在DB表中。如果调用成功,请更新此字段。如果调用失败,您不会更新它。下次您的客户端知道从哪里开始。在该表中更复杂的场景中,您可以存储用于检索帐户更新的所有时间段。例如
ID StartTime Success
1 01-01-2021 00:00:00 true
2 01-01-2021 00:15:00 false
3 01-01-2021 00:30:00 true
这些时间段可以提前生成,也可以由客户端作为调用结果插入。
然后,您可以将此Id链接到Account表,并在需要时对每个时间段执行对账。让我们假设数据库帐户中有TimePeriod.Id=1:123,456
,但后来发现还有更多。您使用存储在DB中的时间进行调用,得到例如123,456,789
,然后您看到应该添加789。