Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 识别从后端激发的重复请求_Java_Cloud - Fatal编程技术网

Java 识别从后端激发的重复请求

Java 识别从后端激发的重复请求,java,cloud,Java,Cloud,我面临一个需要跟踪重复请求的用例,这些请求是通过来自后端的RESTAPI调用触发的。每个请求都写入数据库,因此不需要再次处理重复的请求 重复请求可能来自同一个VM下的不同线程,也可能位于不同的VM下。问题是如何识别这些重复请求 我能想到的方法: 如果请求的结果已经是我们处理请求时的结果,则在每次处理传入请求之前检查数据库。如果是,则忽略该请求,否则将对其进行处理 对于已处理的每个传入请求,将其以序列化格式存储在映射到值(类似于哈希索引)的db中。然后,对于每个传入请求,检查db是否已经有该请求。

我面临一个需要跟踪重复请求的用例,这些请求是通过来自后端的RESTAPI调用触发的。每个请求都写入数据库,因此不需要再次处理重复的请求

重复请求可能来自同一个VM下的不同线程,也可能位于不同的VM下。问题是如何识别这些重复请求

我能想到的方法:

  • 如果请求的结果已经是我们处理请求时的结果,则在每次处理传入请求之前检查数据库。如果是,则忽略该请求,否则将对其进行处理

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


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

    我认为在这种情况下,您无法避免DB操作

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

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

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

    在web开发中,“双重提交”是一个常见的问题。对于标准表单,一个常见的习惯用法是
    submit-redirect-get
    ,它避免了许多问题

    我假设您正在使用javascript向REST后端发出请求?防止一个用户复制请求的一个简单方法是在单击按钮后使用javascript在一小段时间内禁用该按钮


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

    这在很大程度上取决于您的系统。但是,为什么您甚至可能创建重复的请求?在让服务器负责区分它们之前,您应该尝试在调用端解决这个问题。这些请求做什么,为什么两个不同的线程发送相同的请求?理想情况下,不应该有重复的请求。但是很多时候,系统的用户可能会点击同一个按钮两次,或者我们向其他团队公开的API可能会被调用两次。我想知道我们怎样才能从我这边保证它。这些请求写入数据库中的一个表中。如果我们只使用GUID,生日悖论难道不会得到解决吗?碰撞的概率会变为~0?