简单应用到复杂应用演变

doMore 858 2022-01-16

前言

记得刚开始做第一个应用程序的时候,我没有考虑太多的设计和架构方面,主要原因是缺乏关于应用程序生命周期方面的知识:如何编写最小可行产品,然后随着用户的增长进行扩展。

1. 最基础的 Web App 设计

假设有一个应用程序,你的客户用它发送和接收一些数据。

这种情况,你仅仅需要一个 服务器 和 一个数据库就可以提供服务。

基础架构

2. 扩大服务器规模

随着对用户数量的增长,原有服务器无法支撑,有必要提高部署服务器的 CPU 配置。然而,升级 CPU 的代价是昂贵的,也是不可持续的,因为它增长到一定的水平之后变得无法提升。最好的办法是增加服务器的实例数量。所以负载均衡是必须的,从而可以实现应用逻辑的横向扩展。

因为某些解决方法需要存储一个会话id或者鉴权token,因此需要 Redis 等类型的数据库进行额外的数据存储,因为负载均衡器是不会记录这些信息的

扩大服务器规模

3. 使用缓存扩展数据库

随着应用程序的节点数量增加,我们的数据库可能会因为请求数量过多而面临问题。我们可以将请求最多的数据存储在 Redis 或者云服务器提供商提供的分布式缓存系统中。

使用缓存数据库

4. 分布式数据库

如果缓存依旧不能解决数据库工作量过多的的问题,可以考虑使用单个数据库转为水平扩展,即应用数据存储在多个数据库实例中,虽然这是有挑战的工作,但是云服务商提供了许多解决方案。

水平扩展数据库

5. 提高响应速度

即使应用程序的规模足以满足用户量增加的请求,我们可能仍然需要在设计中进行额外的改进。

例如:用户向应用发起了一个请求,但是这个请求会处理很长的时间,我们不希望用户等我们处理完成。于是应用程序增加请求队列,要求某些请求或者任务先放在队列中,然后异步去处理。因此,用户一旦提交一个请求,服务器会立即返回给响应。在之后的一段时间内,提交的请求会被处理,并且持久化到数据库中。

任务提交队列