Как предотвратить гонку при создании документа на сервере разбора? - PullRequest
0 голосов
/ 15 ноября 2018

Мобильное приложение использует сервер синтаксического анализа в качестве внутреннего сервера с mongoDB в качестве базы данных.

Для каждого пользователя в коллекции User в коллекции UserProfile есть профиль пользователя.Профиль пользователя имеет поле указателя в качестве ссылки на User, к которому принадлежит профиль пользователя.

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

Это потому, что процесс регистрации выглядит следующим образом:

  1. Клиент: пользователь регистрируется
  2. Сервер: создает профиль пользователяв afterSave из User
  3. Клиент: после регистрации вызывает функцию облачного кода updateProfile для обновления информации в профиле пользователя
  4. Сервер: updateProfile ищет существующий профиль пользователя или создает новый, если его нет

Это вызывает состояние гонки: сервер создает профиль пользователя на шаге № 2 и в то же времяupdateProfile создает новый профиль пользователя на шаге # 4.Разница во времени в createdAt этих пользовательских профилей составляет миллисекунды.

Сейчас:

  • Если я пропущу шаг # 2, то даже если шаг # 4 получит вызовыНесколько раз сразу после этого, это может вызвать состояние гонки, потому что updateProfile не найдет профиль пользователя, пока он не будет создан.С другой стороны, каждому пользователю необходимо иметь связанный с ним профиль пользователя, поэтому создание его на стороне сервера - единственный способ убедиться в этом.

  • Если я изменю шаг # 4, насоздайте новый профиль, тогда информация в профиле не обновляется, когда клиент вызывает функцию облачного кода updateProfile, поскольку профиль пользователя с шага # 1 еще не создан.

Каков правильный подход?

Обновление:

  • К сожалению, профиль пользователя не может быть создан на beforeSave из User, потому что у него, похоже, нет ID еще.Если бы это было возможно, то было бы гарантировано, что профиль пользователя будет создан до , клиент звонит updateProfile.
...