如何为每日电影益智游戏构建经济高效的架构

我一直在开发一款名为 starcrossed 的每日电影益智游戏,我设法免费建立并维护了它。目前,我们每天有大约 500 名用户,并且这个数字还在不断增长。虽然如果流量呈指数级增长,情况可能会发生变化,但看到创建和维护这样的项目是多么实惠,真是太酷了。

作为当今的软件工程师,面对日益繁多的工具和技术选择,我们很容易感到不知所措。但我们也很幸运,有很多免费或低成本的服务,使这样的项目成为可能。

以下是迄今为止我用来构建 starcrossed 的大部分工具的列表:

  • 韦尔塞尔
  • AWS S3、Lambda、API 网关和 Cloudwatch
  • Cloudflare
  • 用于本地存储和 IndexedDB 的 Web API
  • NextJS、TailwindCSS、Iconmonstr
  • TM数据库
  • 韦尔塞尔

    我非常欣赏 Vercel,他们的免费 Hobby 计划是一个很好的起点——但不要让计划名称欺骗你,它带有一套相当强大的功能。查看他们的定价页面以了解更多信息。

    当你创建一个项目时,Vercel 会为你提供一个免费域名(例如 `*.vercel.app`),但如果你愿意,你也可以轻松自带域名。我通过 Porkbun 购买了我的域名,仅花费 3 美元(这是该项目迄今为止最昂贵的购买)。

    虽然这不是对 Vercel 的详尽评论,但我相信已经有很多这样的评论了,我将提到一些我最喜欢的功能:

    **部署和即时回滚**

    一旦你将 Github 项目连接到 Vercel,合并并推送到主分支将触发自动生产部署。当你创建拉取请求时,该分支将获得其自己的指定预览 URL(在 hobby 上仅限于一个分支 URL)。我经常使用此功能通过与我的 QA 团队(即我的朋友)共享特定于分支的 URL 来测试拉取请求。

    虽然这一点本身就很强大,但启动即时回滚的能力可能更有价值。如果你合并了一个有问题的拉取请求,只需点击几下鼠标就可以立即回滚到之前的部署。我并不知道需要这么做……😅。

    A screenshot of the Vercel deployments page, showing a list of recent Production deployments. There is a pop-out menu opened for one of the deployments showing the Instant Rollback option.

    **分析**

    只需几行代码,您就可以拥有一个不依赖 cookie 的免费分析工具。免费计划每月可获得 2500 个事件,这在刚开始时非常方便。我没有升级到 Pro 以获得每月 25k 个事件,因为我找到了使用 Cloudflare 分析工具的解决方法(更多详细信息请参阅下面的 Cloudflare 部分)。

    **缓存**

    Vercel 提供灵活的缓存管理,与 NextJS 等框架配合使用时,其功能将更加强大。对于 starcrossed,缓存策略相当简单 — 拼图文件获取响应在第一次请求后缓存。每个拼图都存储为单个 JSON 文件,由于每个人都使用同一个文件一整天,因此可以立即缓存。这种方法不仅可以提高性能,而且由于实际上很少有请求到达 AWS,因此几乎每个月我的 AWS 账单都为零。

    AWS

    说到 AWS,下面是正在使用的简单架构图。

    null

    API 网关处理请求以提取存储在 S3 存储桶中的 JSON 拼图文件。我遵循了 AWS 提供的这种模式。为了确保请求合法,我使用了 Lambda Authorizer 函数。S3 存储桶在 us-west-2 中设置了复制和故障转移。API 网关配置了两个阶段:**dev** 和 **prod**。为 lambda 函数和两个 API 网关阶段设置了 Cloudwatch 日志组。

    我唯一产生费用的月份是 9 月,费用仅为 0.14 美元:

  • API 网关:0.12 美元
  • S3 售价 0.02 美元
  • 我还没有深入研究为什么我只有这个月被扣款,所以很遗憾目前无法提供更多详细信息。我还设置了账单警报,以防止我的账户爆仓,所以我并不急于进一步调查。

    Cloudflare

    我选择使用 Cloudflare 作为我的 DNS 提供商,主要是因为它的免费分析工具。奇怪的是,报告的流量数字略高于 Vercel,有时 Cloudflare 上的数字加起来不正确(见下面的屏幕截图)。我并不关心细粒度的流量,所以我没有费心去做更多的研究。此外,这些数字对于查看总体趋势仍然有用。

    null

    看看我们 30 天的独立访客图表。总独立访客数显示为 10.76k,但如果将每天的访客数分别加起来,结果为 15.94k,差异相当大。如果您知道这些数字为何不同,请告诉我。

    null

    7 天图表也是一样,如果将这 7 个值相加,结果为 3.81k。此外,12 月 12 日星期四,我们的流量激增,Cloudflare 将其列为 11 日晚上 7 点至 12 日晚上 7 点期间的 765 名独立访客。Vercel 在同一时间段内统计的访客数量高达 709。不必担心,但这是一个有趣的观察结果。(我确保检查了这两项服务是否使用相同的时区,事实确实如此)。

    本地存储和 IndexedDB Web API

    为了避免设置用户授权和数据库的复杂性和成本,我选择使用现有的 Web API 来处理大部分相同的功能。当然,主要缺点是我们的用户数据更容易被永久删除(无论是否意外)。

    本地存储用于存储正在进行的游戏的数据,例如您之前的猜测、找到的答案和当前选择的图块。我还选择使用 IndexedDB 来实现明确的意图分离:本地存储存储正在进行的游戏数据,而 IndexedDB 存储之前完成的游戏的统计数据和数据。此外,IndexedDB 的存储容量比本地存储大得多。如果 starcrossed 继续发展,并且游戏持续一段时间,那么我们更活跃的用户的数据可能会堆积起来。此外,将长期数据存储在 IndexedDB 中将有助于整合即将推出的功能,例如终身统计数据和谜题档案。

    NextJS、TailwindCSS、Iconmonstr

    框架有很多选择,但我选择了熟悉的框架,这样可以让我更快地构建。而且它们都是免费的,而且制作精良,所以我必须给它们点赞。

    TM数据库

    TMDB(电影数据库)不是软件或架构相关工具,而是由社区运营的 IMDb 替代品,非商业用途免费。他们拥有庞大的演员、电影和介于两者之间的所有内容的数据集。

    综上所述…

    构建像 starcrossed 这样的每日电影益智游戏是一项令人兴奋的挑战,使用低成本的架构解决方案让我能够让事情变得简单且经济实惠。通过利用免费工具,例如用于托管的 Vercel、用于 DNS 和分析的 Cloudflare、用于 API 请求和存储的 AWS 以及标准 Web API,我几乎不花一分钱就能够创建一个可靠、高效的系统。