识别从后端触发的重复请求

Identifying duplicate requests fired from back end

我遇到一个用例,我需要跟踪重复的请求,这些请求是通过后端的 REST API 调用触发的。每个请求都会写入数据库,重复的请求不需要再处理

重复的请求可能来自同一 VM 下的不同线程,也可能来自不同的 VM altogether.The问题是如何识别这些重复请求?

我能想到的方法:

  1. 每次处理传入请求之前,如果请求的结果已经是它的结果,即使我们处理了请求,也要检查数据库。如果是,则忽略该请求,否则对其进行处理。

  2. 对于每个已处理的传入请求,将其以序列化格式存储在映射到值(类似于哈希索引)的数据库中。然后,对于每个传入请求,检查数据库是否已经有该请求。如果是,则忽略其他处理。

但两者都需要数据库读取操作。我可以做得更好吗?

我认为在这种情况下您无法避免数据库操作。

您的第一种方法是非常针对特定项目的方法。 第二种方法也不能应用于任何代码,因为可能会出现用户发送多个相同请求并且它们都必须被处理的情况。

一种更通用的方法是让服务器发出令牌,然后将令牌与客户端的每个请求一起传递给服务器。处理每个请求的服务器检查请求中传递的令牌是否已被某人使用。如果没有,则在数据库中标记此令牌已被使用并处理请求。否则忽略请求或发送错误。 客户端可以通过查询服务器方法来获得这样的令牌(在这种情况下,不需要为这个特定请求检查任何令牌),或者可选地,服务器可以在每次响应查询时发送一个新令牌。

您还应该确保偶尔清理过时的令牌,以避免在生成新令牌时污染数据库和冲突,如果您随机生成令牌。 (参见 Birthday paradox)。

"double submit" 是 web 开发的常见问题。对于标准形式,一个常见的习语是 submit-redirect-get,它避免了很多问题。

我假设您正在使用 javascript 向 REST 后端发送请求?防止一个用户重复请求的一种简单方法是使用 javascript 在按钮被单击后将其禁用一小段时间。

但是,如果您必须为多个用户防止这种情况,这在很大程度上取决于您的模型和其他项目细节。