繁体   English   中英

Azure网站和有状态的webApp

[英]Azure Websites and stateful webApp

我有一个作为Azure网站运行的朴素版本的PokerApp。

服务器在其内存中存储表的状态(转弯的状态,盲注值,卡…)等。

这里的问题是,我不知道我可以在多大程度上依靠WebServer的内存来保持“永久”。 服务器的简单重启会导致内存丢失,因此重启之前进行中的所有游戏都将丢失或引起麻烦。

我已经读过有关使用TableStorage保留会话数据并在实例之间共享的信息,但就我而言,它不仅是我要共享的文本字符串,还可以说是一个Lobby objcet,其中包含与游戏相关的所有信息。


这大概是我在内存中拥有的对象的结构

在此处输入图片说明


在发表一些评论之后,您可以看到需要存储的对象很大,并且几乎一直在运行。 我不知道序列化和反序列化在这里对我有多好...

我是否应该考虑希望拥有持久内存而不是网站的Azure VM? 还是有更好的方法来实现这样的目标?


感谢大家的回答和评论,您已经清楚地表明,在云上工作时不能依赖本地内存。 我将进行一些重构并优化“状态”对象,然后使用缓存服务。

不过,我想到了两个问题,一旦您对这些问题有所了解,我保证我会闭嘴接受@astaykov的出色回答。

即时性上的一致性-我的应用程序中有经典的线程锁来避免并发问题,因此我希望你们提出的那些缓存服务具有同等的功能吗?

另外,我每张桌子都有一些超时时间(增加盲注,玩家必须采取行动的秒数……)。 假设用户刚刚折叠了一只手,他已经完成了与状态对象的交互,所以我更新了缓存。 在缓存该状态对象(计时器所属的状态)时,我的计时器将停止计时...
我知道我在这里不能很好地解释自己,但我希望你们明白我的意思。

我建议使用Azure Redis缓存

这是一个很好的示例,说明如何在15分钟内使用Redis Cache构建MVC App

当然,您可以使用Azure托管缓存 或最终得到Azure表。 而且,Azure Tables所能容纳的不仅仅是一个字符串。 但是我相信缓存解决方案将降低通信延迟。

无论哪种方式,您的对象都必须可序列化。 是的-每个访问都会对对象进行序列化/反序列化。 您可以手动完成,也可以让框架为您完成。 根据我的阅读,NewtonSoft.JSON是相当不错的,并且是经过优化的JSON serializerdeserializer。

UPDATE

当您要求VM在云中运行时-VM迟早会重新启动! 应用程序池将回收,将进行计划内的维护,将发生计划外的维护,硬盘将发生故障,内存模块将发生故障,不可预见的灾难将会发生。

只有一件事是可以肯定的-如果您希望数据在服务器崩溃时不受影响,请更改您的思维和设计软件的方式,然后从(本地)内存中取出数据。 或者只是生活一个事实,即应用程序有时可能会丢失状态。

第二次更新-时钟

好吧,你必须发挥自己的想象力和经验。 我会问您的时钟在ASP.NET应用程序的上下文中仍然可以工作(除非它们全部是静态类型的静态属性,这会有点麻烦)。 我的方法是将我的应用程序也大量扩展到客户端(JavaScript)。 有很多很棒的框架-SignalRAngularJSKnockoutJS ,它们都不容小under 通过将对象模型扩展到客户端,可以维护玩家对象在客户端上的生命周期(保持时钟计时),并针对所有这些事件从客户端向服务器发送更新。 如果您看一下SignalR,则可以保持多个客户端(例如播放器)与服务器之间的实时通信。 SignalR的服务器端可以通过Azure Service Bus 甚至Redis很好地扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM