我有一个天真版本的PokerApp作为Azure网站运行。
服务器在其内存中存储表的状态(轮到它,盲目值,卡......)等。
这里的问题是我不知道我可以依赖WebServer的内存来“永久”。简单地重启服务器会导致内存丢失,因此重启之前正在进行的所有游戏都会丢失/造成麻烦。
我已经阅读过使用TableStorage来保存会话数据并在实例之间共享它,但在我的情况下,它不仅仅是我想要共享的文本字符串,而是让我们说例如,一个包含与之关联的所有信息的Lobby objcet比赛。
这大致是我在内存中的对象的结构
在您的一些评论之后,您可以看到需要存储的对象非常大并且几乎不断。我不知道序列化和反序列化对我来说有多好用......
我是否应该考虑一个我希望拥有持久内存而不是网站的天蓝色虚拟机? 或者有更好的方法来实现这样的目标吗?
感谢大家的回答和评论,你已经明确表示在云上工作时不能依赖本地内存。 我将进行一些重构并优化“状态”对象,然后使用缓存服务。
我想到了两个问题,一旦你对这些问题有所了解,我保证会闭嘴并接受@ astaykov的好答案。
实例级别的同意 - 我的应用程序中有经典的线程锁以避免并发问题,所以我希望你们提出的那些缓存服务有相同的东西吗?
另外,我每桌有一些超时(增加盲注,玩家必须采取行动的秒数......)。假设用户刚刚握手,他已经完成了与状态对象的交互,因此我更新了缓存。当缓存该状态对象(计时器所属的)时,我的计时器将停止滴答...
我知道我在这里并没有很好地解释自己,但我希望你们能看到我的观点。
答案 0 :(得分:3)
我建议使用Azure Redis Cache。
Here is a nice sample how to build MVC App with Redis Cache in 15 minutes
您当然可以使用Azure Managed Cache。或者最终使用Azure表。而Azure表可以容纳更多,只是一个字符串。但我相信缓存解决方案会降低通信延迟。
无论哪种方式,您的对象都必须是可序列化的。是的 - 每次访问都会对对象进行序列化/反序列化。您可以手动执行,也可以让框架为您执行此操作。根据我的阅读,NewtonSoft.JSON是非常好的优化JSON序列化器序列化程序。
<强>更新强>
当您要求在云中运行的VM时 - VM迟早会重启!应用程序池将回收,计划的维护将发生,计划外的维护将发生,硬盘将失败,内存模块将失败,将发生无法预料的灾难。
只有一件事是肯定的 - 如果您希望数据在服务器崩溃中存在,请改变您的思考和设计软件的方式,并将数据从(本地)内存中取出。或者只是活着申请可能会在某个时候失去状态。
第二次更新 - 时钟
嗯,你必须发挥你的想象力和经验。我会怀疑你的时钟在ASP.NET应用程序的上下文中是否正常工作(除非所有这些都是静态类型的静态属性,这将是一个小小的地狱)。我的方法也会将我的应用程序大量扩展到客户端(JavaScript)。那里有很多很棒的框架 - SignalR,AngularJS,KnockoutJS,没有一个被低估!通过将对象模型扩展到客户端,您可以在客户端上维护播放器对象的生命周期(保持时钟滴答作响),并将更新从客户端发送到服务器以用于所有这些事件。如果你看看SignalR,你可以保持多个客户端(比如说玩家)和服务器之间的实时通信。 SignalR的服务器端与Azure Service Bus和even Redis很好地扩展。