防止跨多个服务器重复进行POST API调用

时间:2019-03-05 22:50:10

标签: java spring oracle spring-boot jdbc

让我们说我有一个SPA应用程序,用于管理具有以下结构的用户详细信息(姓名,年龄等):

SPA <-> my-api-servcie.com VIP <-> [my-api-server-1.com,my-api-server-2.com]

API是使用SpringBoot,Java,Spring JDBC和oracle 12c构建的

我要强制名称唯一。但是,我无法控制数据库模式,也无法向名称列添加唯一约束。无论如何,我确实实施了以下预防措施:

  • 前端级别
    • 验证以防止名称重复
    • 放置全屏微调框,以防止意外点击
  • API级别
    • 验证以防止名称重复

将以上所有内容都考虑在内,其中一个应用程序用户设法发送了2个POST请求,两个请求均成功通过了上述所有验证。

调用看起来像这样,每个请求花了几毫秒才能完成:

POST my-api-server-1.com/user {name:"Sam"} at 15-JUN-18 02.11.20.000000000 PM
POST my-api-server-2.com/user {name:"Sam"} at 15-JUN-18 02.11.23.000000000 PM 

首先:两个请求相距几乎2秒,但都成功了,这似乎很奇怪。因此,从技术上讲,第二个调用不应通过API级别的验证。发生这种行为的原因是什么?是否有一些短期兑现JDBC或Oracle层?

第二,除了添加数据库约束之外,我还可以采取其他哪些预防措施?

我可以使用同步方法,但这会导致一些性能后果。

1 个答案:

答案 0 :(得分:1)

在您的情况下,同步是不可行的,因为您明确声明正在使用两个应用程序服务器。在两个不同的VM中运行的同步方法显然在这两个VM之间不同步。

我还不知道实现的确切细节(也许可以共享application.properties的匿名版本),但是很有可能已启用了Hibernate缓存。

这些缓存的行为是完全透明的,这意味着当您的应用程序查询实体时,很可能是从缓存而不是数据库为该实体提供服务。再次以您的情况为例,您正在使用两个应用程序服务器,每个服务器都使用自己的数据库缓存。