1

我正在使用 SignalR 2 和 MVC 5 开发一个简单的游戏。我需要跟踪每个用户的“死亡”和“杀戮”数量。这些统计数据需要从多个服务器的多个游戏实例(用户可以有多个并发会话)中读取/写入。

将字段添加到ApplicationUser : IdentityUser合理的解决方案中吗? 我计划使用内置的身份验证系统,因为我喜欢支持 Facebook 和其他 OAuth 提供程序是多么容易。

我应该如何在优化的庄园中更新这些统计信息,以减少多用户/线程/服务器问题并具有高度可扩展性? 统计数据本身很简单,每个用户可能每隔几秒更新一次,但我想要一个可以跨多个服务器支持数百万用户的设计。

例如,我知道我可以在 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 添加到未来。

4

0 回答 0