【发布时间】:2021-01-09 15:50:47
【问题描述】:
我正在开发一款简单的在线游戏,它将在主播和他们的观众之间进行。游戏会话将由流媒体发起,他们创建游戏,然后共享一个链接供所有观众连接。一场比赛将持续约 10 分钟。
我的前端是一个 SPA,它将使用 REST API 与后端通信。
我想在 AWS 上部署它,因为它们具有吸引力的按需计算选项和定价。但是,我想利用我对前端-后端预期交互的先验知识,在保持可扩展性选项的同时,以低成本进行优化。
假设
- 有时游戏可能由 1000 人(甚至更多)人玩,有时可能是 0 人,而且每分钟都在剧烈波动
- 后端保存游戏状态
- 主播和观众交替轮流
- 观众的决定时间是有限的(比如说 10-15 秒)
- 在观看者轮到时,每个观看者都可以代表观看者就应采取的行动提交投票
- 查看器前端将允许用户重复投票并更新他们的投票
- 查看器前端还将定期向后端询问有关所有其他查看器如何投票的一些统计信息 - 这些统计信息应该大约更新。一秒钟一次,一次全部
- 每次主播或观众完成他们的回合时,游戏状态都会迭代,并在主播的前端显示一些结果
在单个游戏会话过程中需要保持以下状态:
- 游戏状态 - 包含游戏的当前状态
- 观众投票状态 - 包含所有观众的投票信息
- 观众投票统计 - 包含观众投票统计的快照
架构
我正在尝试找出适合此类应用程序的最佳架构。
本来我打算有一个单节点服务器并将状态保存在内存中,但这不可扩展,而且在不玩游戏时可能会很昂贵。如果我尝试将它部署在弹性 beantalk 上,我相信无法保证游戏会话中的所有玩家总是被路由到同一个服务器。
因此,根据我收集到的信息,最佳方式可能是将所有状态存储在 DynamoDB 中,使用 lambda 函数实现完整的 REST API,然后定期调用 lambda 函数(例如每秒 1 个)来更新观众投票统计数据,并在轮到时更新游戏状态(这个周期性任务也可能在单个 EC2 实例上处理,您是否更喜欢预定的 lambda?)。
所以我的问题是:
- 这有意义吗?
- 考虑到我提供的限制,您会选择不同的架构吗?如果是,为什么?
- 我是否要以开发的简易性(在节点中编写单个 Web 服务器与编写大量 lambda)来换取低成本的部署?
【问题讨论】:
-
* 您希望将数据状态和统计数据维护多长时间?
-
仅在单个游戏会话的过程中 ~10-15 分钟
标签: amazon-web-services aws-lambda amazon-elastic-beanstalk