SignalR 2 と MVC 5 を使用して単純なゲームに取り組んでいます。各ユーザーの「死」と「キル」の数を追跡する必要があります。これらの統計は、複数のサーバーにまたがる複数のゲーム インスタンス (ユーザーは複数の同時セッションを持つことができます) から読み取り/書き込みを行う必要があります。
フィールドを追加することApplicationUser : IdentityUser
は合理的な解決策ですか? Facebook やその他の OAuth プロバイダーを簡単にサポートできるので、組み込みの認証システムを使用する予定です。
マルチユーザー/スレッド/サーバーの問題を減らし、高度にスケーラブルな最適化された方法でこれらの統計を更新するにはどうすればよいですか? 統計自体は単純で、おそらくユーザーごとに数秒に 1 回しか更新されませんが、複数のサーバーにまたがる何百万ものユーザーをサポートできる設計が必要です。
たとえば、MVC コントローラー内に次のコードを追加して、統計を更新できることはわかっています。
var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var user = um.FindById(User.Identity.GetUserId());
user.Deaths++;
um.Update(user);
ただし、それは非常に安全/トランザクション的ではないようです。別のプロセス/接続/サーバーがそのユーザーを同時に更新している場合、問題が発生する可能性があります。
純粋な SQL 設計では、SQL トランザクションで実行されて現在のカウンターを取得し、それをインクリメントするストアド プロシージャがおそらくあるでしょう。それを、さまざまな API レイヤー (OWIN、MVC、ASP.NET など) が提供するすべての機能を利用する優れた SignalR 設計に変換する方法がわかりません。理想的には、SQL への直接アクセスが問題になった場合に、簡単に Redis を追加できるものです。