Мы не можем сериализовать регистрации, поскольку одновременно регистрируются миллионы пользователей. Параллельные регистрации должны произойти.
Допустим, база данных не содержит имя пользователя 'user1'. Когда два пользователя пытаются зарегистрироваться одновременно с 'user1', он примет это. Но позже это вызовет проблемы. Этого не должно быть.
Я ищу логичное решение. Ничего конкретного. Просто идея, чтобы решить это.
database
multithreading
Аддзи К
источник
источник
Ответы:
Почему бы это принять? Просто применить уникальное ограничение, использовать имя пользователя в качестве первичного ключа или просто выполнить проверку кода приложения внутри транзакции.
Вы должны быть абсолютно в состоянии использовать транзакцию базы данных, чтобы использовать базу данных для предотвращения этого. В противном случае ни одно приложение не сможет поддерживать инварианты в данных базы данных.
С точки зрения масштабирования, базы данных уже изобрели необходимые вам технологии, такие как различные режимы блокировки в зависимости от того, какая именно согласованность вам нужна, распределенные базы данных для нескольких серверов баз данных и т. Д.
источник
Существует стандартное решение для этого. Создайте несколько рабочих для регистрации. К каждому запросу к имени пользователя применяется хеш, и хэш определяет, какой работник обрабатывает запрос. Таким образом, невозможно одновременно обрабатывать два запроса на одно и то же имя пользователя.
Для такого объема запросов рассмотрим хранилище значений распределенного ключа, такого как риск, вместо всей базы данных в качестве хранилища данных.
источник
Это проблема ?
Разрешение двум пользователям завершить регистрацию с неуникальным именем пользователя недопустимо, если для входа в систему используется имя пользователя (а не адрес электронной почты пользователя).
Если имя пользователя не используется для аутентификации, вы можете использовать некоторый фоновый процесс для идентификации и пометки двойников (например, на основе метки времени) и заставить пользователя изменить свое имя пользователя при следующем входе в систему.
Да это проблема
Как вы спрашиваете, я предполагаю, что имя пользователя должно быть уникальным идентификатором. Можно использовать следующие подходы:
источник
Пересмотрите то, что вы считаете уникальным идентификатором для пользователя. У каждого пользователя уже есть уникальный адрес электронной почты, поэтому эта проблема уже решена для вас. Конечно, это означает, что несколько пользователей смогут зарегистрировать одно и то же имя, например «Майк Накис». Есть ли проблема с этим? Вы уверены? Это не проблема для Facebook, например. Существует несколько пользователей Facebook под названием «Майк Накис». Посмотрите на страницу входа в Facebook: она запрашивает «адрес электронной почты или телефон» и «пароль».
источник
Поскольку миллионы пользователей регистрируются одновременно, вы просто используете 26 х 26 серверов регистрации, один для пользователей, начинающихся с aa, один для пользователей, начинающихся с ab, и так далее. В результате на каждом сервере одновременно регистрируются только тысячи пользователей. Если вы все еще не можете справиться с этим, используйте серверы 26 x 26 x 26.
источник