Правильный способ обработки состояния гонки для 3 микросервисов. (Promise.all?) - PullRequest
0 голосов
/ 10 февраля 2020

Как я уверен, что обещание. Все будут выполнять запрос обещания один за другим?

Сценарий У меня есть 3 службы. frontend, uploader и api frontend является клиентом, uploader обрабатывает действия, связанные с хранением Google, а api обрабатывает обычные REST-вещи.

В моей базе данных есть что-то вроде :

{
  id: 1,
  directory: 'googlestorage/dir/randomstring.jpg',
  user_id: 100
}

Теперь у меня в интерфейсе есть функция, которая запускает обновление каталога и удаляет старый, так что конечный результат должен быть.

{
  id: 1,
  directory: 'googlestorage/new_directory/anotherRandomString.jpg',
  user_id: 100
}

В моем frontend мне нужно убедиться, что вызов api для обновления записи в базе данных должен сначала go, прежде чем удалить ее, вызвав fileuploader.

но на моем fileuploader я передаю directory, чтобы проверить и подтвердить, разрешено ли пользователю удалять файл или нет.

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

Я также не хочу сначала удалять файл, потому что, если запрос на обновление базы данных не выполняется?

Я попытался сделать:

await Promise.all([requestUpdateToApi, requestToDeleteFileUploader]);

Но это то же самое, один будет обновлен первый или будет удален первым перед другим.

Я хочу сделать это, чтобы в случае сбоя одного запроса другой тоже не выполнялся - есть ли хорошее решение для этого, не затрагивая структуру базы данных?

1 Ответ

0 голосов
/ 10 февраля 2020

На самом деле я могу просто отредактировать каталог, чтобы каждый файл сохранялся в randomDirectoryName/{userId}/{filename}.

Так что, если я удаляю файл, я просто использую id и user_id для проверки данных, а затем удалите путь под /{userId}/{directoryFromRequest}, не беспокоясь о состоянии гонки.

...