我正在使用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事务中运行的存储过程来获取当前计数器,并将其递增。不知道如何将其转换为良好的SignalR设计,该设计利用了各种API层必须提供的所有功能(OWIN,MVC,ASP.NET等)。理想情况下,如果直接SQL访问成为问题,我可以轻松地将Redis添加到路上。