何百万人ものユーザーが同時に登録しているため、登録をシリアル化できません。並行して登録する必要があります。
データベースにユーザー名「user1」が含まれていないとしましょう。2人のユーザーが「user1」に同時に登録しようとすると、それが受け入れられます。ただし、後で問題が発生します。これは起こらないはずです。
論理的な解決策を探しています。特定のものではありません。これを解決するためのアイデア。
何百万人ものユーザーが同時に登録しているため、登録をシリアル化できません。並行して登録する必要があります。
データベースにユーザー名「user1」が含まれていないとしましょう。2人のユーザーが「user1」に同時に登録しようとすると、それが受け入れられます。ただし、後で問題が発生します。これは起こらないはずです。
論理的な解決策を探しています。特定のものではありません。これを解決するためのアイデア。
回答:
データベースにユーザー名「user1」が含まれていないとしましょう。2人のユーザーが「user1」に同時に登録しようとすると、それが受け入れられます。
なぜそれを受け入れるのですか?一意の制約を適用したり、ユーザー名を主キーとして使用したり、トランザクション内のアプリケーションコードでチェックを実行したりするのは簡単です。
絶対にデータベーストランザクションを使用してデータベースを使用し、これが発生しないようにする必要があります。そうしないと、アプリケーションはデータベースデータの不変式を維持できません。
スケーリングに関しては、データベースは、必要な整合性の種類に応じたさまざまなロックモード、複数のデータベースサーバー用の分散データベースなど、必要なテクノロジーを既に発明しています。
それって問題ですか ?
ユーザー名(ユーザーのメールアドレスではない)がログインに使用される場合、2人のユーザーに一意でないユーザー名で登録を終了させることは受け入れられません。
ユーザー名が認証に使用されていない場合は、バックグラウンドプロセスを使用して倍精度浮動小数点型(タイムスタンプなどに基づく)を識別してフラグを立て、ユーザーに次回ログオン時にユーザー名を強制的に変更させることができます。
はい、それは問題です
あなたが尋ねているように、私はユーザー名が一意のIDであると想定されていると思います。次のアプローチを使用できます。
何百万人ものユーザーが同時に登録する場合、26 x 26の登録サーバーを使用します。1つはaaで始まるユーザー用、1つはabで始まるユーザー用などです。その結果、各サーバーに同時に登録するユーザーは数千人になります。それでも処理できない場合は、26 x 26 x 26サーバーを使用します。