Azure 网站和有状态 WebApp

标签 azure azure-web-app-service stateful

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

服务器在内存中存储牌 table 的状态(轮到谁、盲注值、牌...)等。

这里的问题是我不知道我可以在多大程度上依赖WebServer的内存来实现“永久”。简单地重新启动服务器就会导致内存丢失,因此重新启动之前正在进行的所有游戏都会丢失/造成麻烦。

我读过有关使用 TableStorage 保存 session 数据并在实例之间共享它的内容,但就我而言,它不仅仅是我想要共享的文本字符串,例如,一个 Lobby 对象,其中包含与关联的所有信息游戏。

<小时/>

这是我在内存中的对象的大致结构

enter image description here

<小时/>

经过您的一些评论,您可以看到需要存储的对象相当大,并且几乎不断被存储。我不知道序列化和反序列化在这里对我来说有多好......

我是否应该考虑使用我希望拥有持久内存的 azure 虚拟机而不是网站? 或者有更好的方法来实现这样的目标吗?

<小时/>

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

我想到了两个问题,一旦你对这些问题有了一些了解,我保证我会闭嘴并接受@astaykov 的精彩答案。

实例级别的并发 - 我的应用程序中有经典的线程锁以避免并发问题,所以我希望你们建议的那些缓存服务有等效的东西?

此外,我每 table 都有一些暂停(增加盲注、玩家必须采取行动的秒数......)。假设用户刚刚放下手,他完成了与状态对象的交互,因此我更新了缓存。当该状态对象(计时器所属的)被缓存时,我的计时器将停止计时......
我知道我在这里没有很好地解释自己,但我希望你们能明白我的观点。

最佳答案

我建议使用 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 序列化器/反序列化器。

更新

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

只有一件事是确定的 - 如果您希望数据在服务器崩溃时幸存下来,请改变您思考和设计软件的方式,并从(本地)内存中取出数据。或者只是接受应用程序有时可能会丢失状态的事实。

第二次更新 - 时钟

好吧,你必须发挥你的想象力和经验。我会质疑你的时钟在 ASP.NET 应用程序的上下文中是否能正常工作(除非它们都是静态类型的静态属性,这会有点 hell )。我的方法是将我的应用程序也大量扩展到客户端(JavaScript)。有很多很棒的框架 - SignalR , AngularJS , KnockoutJS ,任何一个都不容小觑!通过将对象模型扩展到客户端,您可以在客户端上维护玩家对象的生命周期(保持时钟滴答作响)并将所有这些事件的更新从客户端发送到服务器。如果您看一下 SignalR,您可以在多个客户端(例如玩家)和服务器之间保持实时通信。 SignalR 的服务器端可以很好地扩展 Azure Service Buseven Redis .

关于Azure 网站和有状态 WebApp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26089635/

相关文章:

machine-learning - 这是使用状态 LSTM 神经网络预测时间序列的正确方法吗?

VS2015 中的 Azure 应用服务项目模板和新发布目标

azure - Kubernetes 虚拟节点池虚拟机意外费用

Azure 网站 - 创建 ftp 帐户

azure-web-app-service - 带有 asp.net core 2.0 Razor Pages 的渐进式 Web 应用程序

azure - Azure 应用服务主机名绑定(bind)中 hostNameType 的用途

linux - iptables -j 与 -g 参数

c - 如何在解析不同流的 block 时保持 Bison 状态?

python - 为什么 registerTempTable 从数据框中删除一些行?

.net - Azure 表存储插入或替换结果