Arquitetura
Escalabilidade
Backend
Microsserviços
Cloud

可扩展的软件架构 - 扩展的最佳实践

“攀登”是一个神奇的词。每个人都想打造下一个 Facebook 或 WhatsApp。但当流量真正增加时,大多数系统就会崩溃。

可扩展的软件架构 - 扩展的最佳实践

“攀登”是一个神奇的词。每个人都想打造下一个 Facebook 或 WhatsApp。但当流量真正增加时,大多数系统就会崩溃。

构建可扩展的软件并不是使用最新的工具,而是使用最新的工具。它是关于设计一个可以增长的系统,而无需为用户数量每增加 10 倍而从头开始重写。

在本指南中,我们将探索需要遭受打击的系统的架构最佳实践。

1. 松耦合

想象一下所有车厢都焊接在一起的火车。如果其中一节车厢脱轨,整列火车都会倒塌。 这是一个耦合系统(刚性整体)。

为了扩展,您需要解耦。

  • 异步通信:它不是“服务A”调用“服务B”并等待响应(锁定线程),而是向队列(RabbitMQ、Kafka)发送消息。 “服务 B”会尽可能处理它。
  • 优点:如果服务 B 出现故障或速度变慢,服务 A 会继续工作并对消息进行排队。系统不级联。

2. 数据库:大瓶颈

在 90% 的情况下,系统无法扩展,因为[数据库0崩溃。

  • 分片:将数据划分到多个服务器上。用户 A-M 在服务器 1 上,N-Z 在服务器 2 上。Instagram 就是这样做的。
  • CQRS(命令查询职责分离):将读模型与写模型分离。
    • 要写入(INSERT),请使用健壮的关系数据库(PostgreSQL)。
    • 要读取 (SELECT),请使用非规范化且快速的版本(Elasticsearch 或 Mongo)。

3.无国籍

如果您有 100 台服务器,其中任何一台都应该能够为任何用户提供服务。

  • 规则:切勿将“会话”存储在服务器的 RAM 内存中。
  • 解决方案:将状态存储在客户端(JWT 令牌)或外部缓存库(Redis)中。
  • 结果:您可以关闭 50 台服务器并打开 50 台新服务器,而无需断开任何用户的连接。这将启用自动缩放(在云中自动缩放)。

4.分层缓存

最快的请求甚至无法到达[数据库1。

  • 浏览器缓存:用户的浏览器存储图像和CSS。
  • CDN (Cloudflare):在边缘存储静态内容。
  • 应用程序缓存(Redis):存储频繁查询的结果。

积极的缓存策略是 Reddit 和 Twitter 等网站的秘密。

5. 优雅降级

当规模扩大时,事情将会崩溃。硬盘被烧毁,电缆被切断。 您的系统必须做好部分失败的准备。

  • Netflix 示例:如果“个性化推荐”服务出现故障,Netflix 不会出现故障。它显示“热门电影”的静态列表。用户甚至没有意识到后端出现了严重故障。

结论

可扩展性不是您按下的“按钮”。这是一门设计学科。它需要从第一天开始就考虑队列、缓存、故障和分区。如果您在构建软件时假设它会崩溃,那么它的扩展性可能会比您假设一切都会完美运行时要好得多。

另请阅读

  • [可扩展的软件架构 - 初创公司的最佳实践2
  • [可扩展的软件架构 - 小团队的最佳实践3
  • [可扩展的软件架构:如何构建可增长的系统4
  • [应用中的微服务:移动分布式架构5
  • [单体 vs 微服务:选择哪种架构6
  • 【应用架构-企业最佳实践7