如何防止在REST api GET中向不同的客户端发送相同的数据?

时间:2015-01-07 08:09:22

标签: rest distributed-system

我有15个工人客户和一个通过互联网连接的主人。工作与数据以json格式通过REST api传递。 工作不限于任何特定客户。任何工作人员都可以定期(例如30秒)查询可用作业,处理它并更新状态。 在这种情况下,如何防止在GET请求时将相同的记录发送到不同的客户端。

以下是解决此问题的解决方法:

从数据库中取出前5个未处理的记录,并将其设置为SENT并通过REST GET公开。 但问题是,它会造成不一致。有时,由于网络连接问题,客户端无法获取数据。但在服务器中,它将被标记为SENT。因此,没有其他客户可以获得该数据。它将永远作为SENT。

从服务器获取列表,并将收到的作业ID列表回复给服务器。但是在这个时间差距之间,其他一些客户也得到了同样的工作。

2 个答案:

答案 0 :(得分:3)

您在分布式系统中偶然发现了一个基本问题: 无法知道对方是否收到了您的消息。您当然可以改进TCP和ack消息的情况。但是如果你从来没有得到确认消息永远不会到达,它是否已经到达,但收件人在处理之前死亡,或收件人是否发送了ACK并且ACK被丢弃了?

这意味着您需要设计系统以多次处理接收数据。

您提供两种部分解决方案;如果你把它们结合起来,你的解决方案就会像SQS一样工作。使用时间戳将项目标记为pending_ack。客户回复后,会将其标记为sent。在特定时间段之后的任何pending_acks都有资格重新发送。

选择您的时间段以允许慢速网络和慢速客户端,并且当您真的不知道客户端是否死亡时,它会归结为只发送重复项。

答案 1 :(得分:0)

也许您应该重新考虑阻止资源的方法。 REST架构 - 根据定义,没有义务保存有关客户端的信息。相反,您可能需要考虑乐观并发控制(http://en.wikipedia.org/wiki/Optimistic_concurrency_control)。