Asp.net mvc 5 更新SignalR hub中的每用户统计信息

Asp.net mvc 5 更新SignalR hub中的每用户统计信息,asp.net-mvc-5,signalr,asp.net-identity,signalr-hub,signalr-backplane,Asp.net Mvc 5,Signalr,Asp.net Identity,Signalr Hub,Signalr Backplane,我正在使用Signalr2和MVC5开发一个简单的游戏。我需要跟踪每个用户的“死亡”和“死亡”数量。这些统计数据需要从多个服务器上的多个游戏实例(用户可以有多个并发会话)读取/写入 将字段添加到ApplicationUser:IdentityUser是否是一个合理的解决方案?我计划使用内置身份验证系统,因为我喜欢支持Facebook和其他OAuth提供商是多么容易 我应该如何在优化的manor中更新这些统计数据,以减少多用户/线程/服务器问题并具有高度可扩展性?这些统计数据本身很简单,每个用户可

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

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

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

例如,我知道我可以在MVC控制器中添加以下代码来更新统计信息:

    var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    var user = um.FindById(User.Identity.GetUserId());
    user.Deaths++;
    um.Update(user);
var um=HttpContext.GetOwinContext().GetUserManager();
var user=um.FindById(user.Identity.GetUserId());
user.death++;
更新(用户);
然而,这似乎不是很安全/事务性的。如果另一个进程/连接/服务器正在同时更新该用户,则可能会发生不好的事情


在纯SQL设计中,我可能有一个在SQL事务中运行的存储过程来获取当前计数器,并使其递增。不知道如何将其转化为一个好的信号器设计,该设计利用了各种API层所提供的所有功能(OWIN、MVC、ASP.NET等)。理想情况下,如果直接SQL访问成为一个问题,我可以很容易地将Redis添加到其中。

我同意,在多线程环境中,更新数据库中的死亡/死亡计数器可能会导致不安全的事务。我会尝试将项目推送到一个公共队列,使用一个单线程处理类将其解队列并执行适当的操作。另外,感谢您抢先支持多实例游戏玩家。我们很感激,谢谢你的建议。我希望像我所认为的一样常见的东西有一个简单的现有解决方案,但如果没有,队列的想法听起来不错,如果我不得不这么做的话,我可能会同时实现Redis。如果类更新SQL保证是一个单一实例,你可以使用
lock
。我同意,在多线程上下文中,在数据库中更新死亡/杀死计数器可能会导致不安全的事务。我会尝试将项目推送到一个公共队列,使用一个单线程处理类将其解队列并执行适当的操作。另外,感谢您抢先支持多实例游戏玩家。我们很感激,谢谢你的建议。我希望像我所认为的一样常见的东西有一个简单的现有解决方案,但如果没有,队列的想法听起来不错,如果我不得不这么做的话,我可能会同时实现Redis。如果类更新SQL保证是一个单一实例,你可以使用
lock