探索路线
了解网页界面、无状态和有状态的概念,以及我们将要创建的游戏。
一个前进的计划
欢迎!我们即将开启一段探索之旅,这将是一次令人兴奋的体验。我们将做许多人都说最热爱的事情:尝试新的编程语言,实验新的技术,并拓展对编写网页软件的理解。每次探索之前,拥有一张地图、明确的目标以及清晰的行动路线都至关重要。这正是本章的核心内容。
早期的客户端-服务器系统大多是带有状态的。服务器会将运行时的状态保存在内存中,通过持久连接与客户端来回传递消息。想象一个银行系统,由一台中央主机和每位柜员专用的终端组成。这种架构之所以可行,是因为客户端数量较少。客户端越少,维持并发连接所需的系统资源就越有限。
关于网页界面的一些背景
蒂姆·伯纳斯-李发明了一种全新的客户端-服务器系统,名为万维网(World Wide Web)。
万维网是一个极其成功的软件平台,几乎遍布地球上的每一个角落,可在几乎任何设备上使用。随着万维网的发展和普及,HTTP 协议也随之壮大。HTTP 是一种无状态协议,因此我们通常也将网络应用视为无状态的。但这其实是一种错觉。应用程序要完成任何有意义的任务,就必须保持状态。然而,我们不再将状态存储在服务器内存中,而是将其转移到数据库中,等待下一次请求的到来。
将状态移至数据库带来了实实在在的优势。基于 HTTP 的应用只需在发送响应前短暂地与客户端保持连接,因此能以更少的资源处理相同数量的请求。大多数编程语言都无法提供足够的并发能力,来维持现代网页应用所需的大量持久连接。
无状态的用户界面
“无状态”让我们实现了可扩展性。
但无状态也付出了代价。它引入了显著的延迟,因为应用必须多次访问数据库才能获取数据并生成响应。这使得数据库成为性能瓶颈,也让我们习惯于根据数据库模型来设计数据结构,而非从应用代码的角度出发。
Elixir 提供了充足的并发能力,足以支撑有状态的服务器。Phoenix Channels 正是实现这一目标的通道。一个单一的 Phoenix 应用可以同时维持数十万甚至上百万个客户端的持久 Channel 连接。这些客户端可以通过服务器协调,彼此广播消息。
在处理这些消息时,应用依然保持快速响应。Elixir 和 Phoenix 为现代网页流量提供了真正可行的替代方案——一种能够高效处理高并发的有状态服务器架构。
使用 Elixir 构建有状态的应用
现在,我们将借助 Elixir 编写的有状态应用,以及一个持久的 Phoenix Channel,探索这一全新可能性。这个 Channel 可以随时连接到任意前端应用。
我们将通过构建一款名为“岛屿”的游戏来实现这一目标。这款游戏或许不会成为你最爱的游戏平台上的热门下载,但它玩起来一定很有趣。更重要的是,通过开发它,我们将学到很多东西。游戏开发者始终推动着网页技术的极限,他们必须以创新的方式解决性能问题。我们也将重新思考自己的开发思路。所学的知识将帮助我们以更高效的方式解决日常业务中的各种挑战。
我们将分阶段完成“岛屿”游戏的开发。首先,用 Elixir 构建一个有状态的游戏引擎;然后,叠加使用 Phoenix 实现网页界面。我们不会完整构建一个前端应用,因为所有需要掌握的内容都将涵盖在内。
我们会提供一个演示用的前端应用代码。这样,你就可以在本地机器上直接运行并体验这个游戏。
我们将以一种你可能不熟悉的方式来构建“岛屿”游戏。那么,让我们先了解一下接下来要走的路。