何百万ものユーザーが同時に登録しているため、登録をシリアル化できません。並列登録を行う必要があります。
データベースにユーザー名「user1」が含まれていないとしましょう。 2人のユーザーが「user1」で同時に登録しようとすると、それが受け入れられます。しかし、後で問題が発生します。これは起こらないはずです。
論理的な解決策を探しています。特に何もない。これを解決するためのアイデア。
データベースにユーザー名「user1」が含まれていないとしましょう。 2人のユーザーが「user1」で同時に登録しようとすると、それが受け入れられます。
なぜそれを受け入れるのですか?一意の制約を適用する、ユーザー名を主キーとして使用する、またはトランザクション内でアプリケーションコードのチェックインを実行するのは簡単です。
これを防ぐには、データベーストランザクションを使用してデータベースを使用できる必要があります。そうしないと、アプリケーションはデータベースデータの不変条件を維持できません。
スケーリングに関しては、データベースはすでに必要なテクノロジーを発明しています。たとえば、必要な一貫性の種類に応じたさまざまなロックモード、複数のデータベースサーバー用の分散データベースなどです。
これには標準的な解決策があります。登録を行う複数のワーカーを作成します。各リクエストにはユーザー名に適用されるハッシュがあり、ハッシュはどのワーカーがリクエストを処理するかを決定します。この方法では、同じユーザー名に対する2つのリクエストを同時に処理することはできません。
この種のリクエストでは、データストアとしてallデータベースではなく、リスクなどの分散キーバリューストアを検討してください。
それは問題ですか?
ログインにユーザー名(ユーザーの電子メールではない)が使用されている場合、2人のユーザーが一意でないユーザー名で登録を完了することは許可されません。
ユーザー名が認証に使用されていない場合は、バックグラウンドプロセスを使用して、(たとえば、タイムスタンプに基づいて)ダブルを識別してフラグを付け、ユーザーに次のログオン時にユーザー名を変更させることができます。
はい問題です
ご質問のとおり、ユーザー名は一意のIDであると想定しています。次のアプローチを使用できます。
ユーザーの一意の識別子と考えるものを再考します。各ユーザーは既に一意のメールアドレスを持っているので、その問題はすでに解決されています。もちろん、これは、「マイクナキス」のように、複数のユーザーが同じ名前を登録できることを意味します。それで問題はありますか?本気ですか?フェイスブックなどでは問題ありません。 「マイク・ナキス」と呼ばれる複数のFacebookユーザーが存在します。 Facebookのログインページを見てください。「メールまたは電話」と「パスワード」の入力を求められます。
何百万ものユーザーが同時に登録する場合、26 x 26の登録サーバーを使用します。1つはaaで始まるユーザー用、もう1つはabで始まるユーザー用などです。その結果、各サーバーに同時に登録するユーザーは数千人に過ぎません。それでも対応できない場合は、26 x 26 x 26サーバーを使用してください。