Предотвращение дублирования вызовов POST API на нескольких серверах - PullRequest
0 голосов
/ 06 марта 2019

Допустим, у меня есть приложение SPA для управления данными пользователя (имя, возраст и т. Д.) Со следующей структурой:

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

API построен с использованием SpringBoot, Java, Spring JDBC, oracle 12c

Iхотите, чтобы имя было уникальным.Однако у меня нет контроля над схемой БД, и я не могу добавить уникальное ограничение для столбца имени.В любом случае, я реализовал следующие превентивные меры:

  • Уровень интерфейса
    • проверка для предотвращения повторяющихся имен
    • раскладка полноэкранного спиннера для предотвращения случайных нажатий
  • Уровень 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 Ответ

1 голос
/ 06 марта 2019

Синхронизация невозможна в вашем случае, потому что вы четко заявляете, что работаете с двумя серверами приложений. Синхронизированный метод, работающий в двух разных виртуальных машинах, явно не синхронизируется между этими двумя виртуальными машинами.

Кроме того, я не знаю точных деталей вашей реализации (возможно, вы можете поделиться анонимной версией вашего application.properties), но весьма вероятно, что у вас включен кеш Hibernate.

Эти кэши действуют совершенно прозрачно, это означает, что когда ваши приложения запрашивают объект, очень вероятно, что этот объект обслуживается из кэша, а не из базы данных. В вашем случае вы снова работаете с двумя серверами приложений, каждый из которых работает со своим собственным кэшем базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...