从零开始构建可扩展后端的 7 个步骤

2025-05-24

从零开始构建可扩展后端的 7 个步骤

从头开始创建可扩展的后端可能非常困难。

采用正确的方法,您可以构建一些可以随着应用程序的发展而成长的东西。

今天,我们将介绍七个实用步骤来帮助您扩展后端,以及 Encore(作为后端框架)如何在其中提供帮助。

让我们开始吧。


🎯 扩展后端意味着什么?

在我们开始讨论要点之前,了解整体概念非常重要。

为了确保你的应用在流量、用户或数据增长的情况下也能保持良好的性能,扩展后端至关重要。例如,一个社交媒体应用每天要处理数百万张照片上传,或者一个电商网站每秒要处理数千个订单(例如亚马逊)。

对此主要有两种方法:

✅ 垂直扩展(向单个服务器添加更多资源)
✅ 水平扩展(将负载分布在多个服务器上)。

 

如果您想了解水平缩放和垂直缩放之间的区别,可以观看此视频。

我的建议?如果你刚刚开始,不要想太多

我认为,当你确定需要更好的基础设施时,这才是值得担心的事情。在那之前,你可以依赖常规的基础设施,很多应用甚至不需要那样的过度设计。

话虽如此,让我们进一步了解一下。


1. 用正确的架构构建正确的基础。

把你的后端想象成一栋建筑的蓝图。如果地基不好,随着负载(或用户)的增加,就会出现问题。让我们看看你可以使用的两种主要架构类型。

🎯 什么是单片架构?

单片架构意味着所有内容都构建为一个大型应用程序。这种架构起步比较简单,但随着规模的增长,可能会变得混乱。应用程序的所有部分相互依赖,因此如果其中一个部分出现问题,整个应用程序都会受到影响。

许多流行的代码库都是从这个架构开始的,比如 Instagram 的早期版本。这种架构适用于较小的应用,但随着规模的扩大,它们可能会变得混乱。

说实话,它仍然可以采用模块化的方式设计,这样可以解决大部分缺点。

单体架构

 

🎯 什么是微服务架构?

微服务架构将应用程序分解为更小、更独立的服务,这些服务通过 API 进行通信。这种方法更具可扩展性和灵活性,因为您可以独立地更新或扩展每个服务,而不会影响整个系统。

Netflix、亚马逊和无数其他公司都使用这种方法,其中应用程序的不同部分(如用户身份验证、付款、推荐)由不同的服务处理。

这可能会变得繁琐和复杂,因此仅推荐用于大公司。

微服务架构

您还应该阅读5 个常见的微服务痛点以及如何处理它们。

如果您对比较指南感兴趣,请查看Atlassian关于微服务与单体式服务的博客。

 

Encore是一个开源后端框架,支持微服务架构。它旨在为团队提供构建微服务所需的工具,从第一天开始。

它还提供了一个称为的可视化工具,Flow可让您始终了解整个系统的最新视图,帮助您推理微服务架构并确定哪些服务相互依赖以及它们如何协同工作。

✅ 在瓶颈发展成大问题之前将其追踪。✅
立即揭示其依赖关系的性质和规模。✅
实时自动更新,以在您更改代码时反映您的架构。

安可流可视化工具


2. 使您的应用程序无状态,实现真正的水平扩展。

无状态意味着每个服务器无需记住用户会话。这就像你不再依赖某个收银员来完成购物,任何收银员都可以帮助你。

这种方法使得添加或删除服务器变得更加容易,而不会中断现有的应用程序,并且它们不依赖于彼此的功能。

它对于那些预计流量激增的应用程序更有用,例如音乐首映期间的 Spotify 或销售活动期间的电子商务网站(如亚马逊)。

 

🎯 如何实现无国籍?

为了实现这一点,必须卸载会话管理。您可以使用:

  • JWT (JSON Web Tokens):一种在请求之间传递用户数据而不将其存储在服务器上的简单方法。

  • Redis:用于会话管理,例如将临时会话数据存储在内存中,并缓存频繁访问的数据,以最大限度地减少数据库调用,从而提高性能。您也可以使用Memcached代替 Redis。

例如,Netflix广泛使用无状态设计来处理用户会话,无论服务器负载如何,都能实现流畅的流式传输。

从设计上来说,它们通常也是REST APIs无状态的,这就是为什么它们非常适合扩展。

无状态架构速查表

ByteByteGo 的无状态备忘单图表

3 智能流量分配,助您节省时间。

在本节中,我们将讨论负载平衡。它是将传入请求均匀分布到多台服务器的过程,以确保任何一台服务器都不会过载,否则会导致速度变慢或崩溃。

它提高了可用性、容错能力以及包括可扩展性在内的很多方面。

负载均衡器

有不同的算法,每个算法都针对独特的流量模式:

Round Robin:循环中按顺序将请求分配给每个服务器。这很简单,但在负载不均衡的情况下可能会遇到困难。

Least connections:将流量定向到活动连接数最少的服务器。

Weighted Round Robin:根据容量为每个服务器分配权重,允许权重更高的服务器处理更多流量

IP Hash:IP 哈希负载平衡算法允许您使用客户端 IP 地址的哈希值来决定哪个服务器满足请求。

Equinix 有一篇有趣的文章,用可视化图表详细解释了负载平衡算法的工作原理。

 

🎯 实现负载均衡器的工具?

以下是实现此目的的一些最广泛使用的工具:

  • NGINX:开源 Web 服务器和反向代理,在处理负载平衡和缓存方面非常灵活。

  • AWS ELB:云管理负载均衡器,可自动在实例之间分配传入流量并根据需求进行扩展。

  • HAProxy:轻量级且高度可靠的开源负载均衡器,以最小的延迟处理大量流量。

您还可以在网上博客上找到更多工具(除了这些)。

提示:您可以将负载均衡器与 Cloudflare 等内容分发网络 (CDN) 结合使用,以减少服务器的负载。


4.不要让数据库成为瓶颈。

随着应用规模的增长,数据库可能会成为一个大问题(因为它通常从未进行过优化)。缓慢的查询和延迟会让用户感到沮丧,并拖累整个系统。

您可以使用一些智能策略来正确处理负载。

🎯 开发人员优化数据库的常见技巧。

Indexing:对频繁查询的列使用索引,以便更快地进行查找。例如,电商应用可以索引产品 ID,以便更快地获得搜索结果。

Caching:将频繁访问的数据存储在内存中,减少直接访问数据库的次数。Redis 或 Memcached 在这方面会很有用。

Database sharding:对于大型应用,你可以对数据库进行分片,就像将其拆分成更小、更易于管理的部分。每个部分(称为分片)可以分布在多个服务器上。

Database Partitioning:您可以将数据库拆分成更小、更易于管理的部分(例如按地区划分客户)以分配负载。

Connection pooling:使用池库有效地管理数据库连接,而不会使数据库过载。

还有许多其他概念,例如查询优化和非规范化,但我不会在这里涵盖所有内容(否则会很长)。

如果您的应用程序规模变大,建议使用分布式数据库,如 MongoDB、Amazon Aurora 或 CockroachDB,它们可以更好地处理更大的数据集和流量。

如果您想了解更多信息,我建议您查看:

ByteByteGo 的数据库扩展速查表

ByteByteGo 的数据库扩展速查表

5.智能监控和日志记录,防止后端崩溃。

随着应用程序的扩展,智能监控和日志记录可以帮助您掌握后端的健康状况,并在问题失控之前发现它们。

想象一下,您的应用一夜之间爆红,流量激增,一开始一切看起来都很好。然后,用户开始报告错误。如果没有适当的监控和日志记录,您将无法弄清楚到底出了什么问题。

获得实时洞察和详细记录,以便您可以识别瓶颈并更快地进行调试,这将使您的工作变得更加轻松,尤其是在意外流量期间。

 

🎯 什么是监控?

监控工具可以实时追踪应用的性能。它们会提供服务器负载(资源使用情况)、响应时间和错误率等指标,以便您发现趋势。您可以使用以下工具:

  • Datadog:提供整个堆栈的可见性。它提供日志管理、应用程序性能监控 (APM) 甚至实时仪表板。

  • Prometheus:开源监控工具,可按指定间隔从已配置的目标收集指标。此外,它还能与 Grafana 完美集成,实现数据可视化。

  • New Relic:另一个监控工具,具有与交易时间、错误率和数据库查询性能相关的见解。

您甚至可以设置警报,当出现异常时通知您的团队。

 

🎯 什么是日志记录?

日志记录后端发生的每个重要事件,例如请求、错误或警告。它就像应用的日记,在出现问题时帮助您进行调试。

  • 使用ELK StackAWS CloudWatch等工具进行集中日志记录,可以轻松搜索和分析所有服务的日志。

  • 结构化日志记录(JSON 格式)使日志可机器读取,从而使调试过程稍微容易一些。

 

🎯 什么是追踪?

追踪功能有助于追踪跨多个服务的单个请求,从而精准定位缓慢或失败的部分。Jaeger 或 OpenTelemetry 等工具非常适合用途。

 

为了获得最大输出,您可以将监控、日志记录和跟踪功能结合起来。您可以使用 Encore 实现所有这些功能。

✅ Encore 提供分布式跟踪来跟踪您的应用程序和基础设施中的请求。

与使用跟踪通常需要进行的密集检测相反,Encore 会自动捕获所有环境中整个应用程序的跟踪。独特的是,这意味着您甚至可以在本地开发中使用跟踪来帮助调试和加快迭代。

您可以访问大量信息,例如堆栈跟踪、结构化日志、HTTP 请求、网络连接信息、API 调用、数据库查询等。

安可分布式追踪

 

✅ 在 Encore 云中,您还可以获得内置支持,跟踪关键指标。此外,您还可以轻松为您的应用定义自定义指标。

关键指标重演

 

✅ Encore 内置了对 Logging 的支持,它将自由格式的日志消息与结构化且类型安全的键值对相结合。这使得计算机更容易解析、分析和索引。

您只需将其添加到模块中:import log from "encore.dev/log";

然后, 您可以调用任何日志记录函数(例如 error、、 或 )  来发出日志消息。warninfodebugtrace

const logger = log.with({is_subscriber: true})
logger.info("user logged in", {login_method: "oauth"}) // includes is_subscriber=true
Enter fullscreen mode Exit fullscreen mode

您还可以通过运行以下命令将日志直接实时传输到终端:encore logs --env=prod。请参阅文档了解更多信息

简而言之,Encore 提供了很多东西,包括一种可视化云微服务架构的方法,以及自动获取带有完整 API 文档的服务目录。

如果您有兴趣了解更多信息,《可观察性原则指南:意义、实际实施和最佳实践》是一个不错的起点。


6. 自动化基础设施配置和 DevOps。

随着应用规模的扩大,手动设置服务器、配置环境或部署代码有时会降低速度。自动化可以消除大部分重复性任务,并提高一致性(即使只是一点点)。

🎯 什么是基础设施自动化?

基础设施自动化就像使用工具自动管理和配置您的服务器、网络和数据库,无需人工干预。

  • TerraformAWS CloudFormation等工具可让您将基础设施定义为代码 (IaC)。

  • 使用 IaC,您只需一个命令即可启动相同的开发、测试和生产环境。

Pulumi就是这样一种现代 IaC 工具,它使用您已经了解的编程语言,例如 JavaScript 或 Python。

 

🎯 为什么要尝试自动化 DevOps?

DevOps 自动化改进了 CI/CD 管道、部署流程和监控任务。

  • JenkinsGitHub ActionsGitLab CI等工具有助于更快、无错误地部署代码。

  • 滚动更新或蓝绿部署可以轻松进行,无需停机。

例如,Kubernetes 通过自行管理应用程序的扩展和负载平衡来实现容器编排的自动化。

 

让我们看看 Encore 如何在这方面提供帮助。

Encore 允许您在应用中将基础架构定义为类型安全的对象,从而将基础架构与应用程序代码统一起来。然后,Encore 可以通过解析应用程序代码来自动化基础架构的配置和 DevOps。

Encore Cloud 可自动在所有环境和所有主要云提供商中配置所有必要的基础设施,而无需更改应用程序代码。

基础设施配置

使用 Encore,您无需在应用程序代码中定义任何云服务细节。这意味着部署后,您可以安全地使用云提供商的控制台修改已配置的资源,或使用 Encore Cloud 仪表板中内置的配置 UI。Encore Cloud 会负责自动双向同步更改。

很多事情都可以变得更容易Encore Cloud 可以完全自动化 AWS 和 GCP 上的 DevOps 和基础设施,将 DevOps 工作量减少近 90%

如果您有兴趣了解更多信息,请查看:


7. 无人谈论的缓存秘密。

缓存可能是后端可扩展性最重要的部分,虽然经常被忽视,但能够大幅减少响应时间和服务器负载。

秘诀在于巧妙地对应用程序中最需要缓存的部分使用缓存。

🎯 什么是缓存?

缓存用于临时存储经常访问的数据,以便将来的请求能够得到更快的处理,而无需重复查询数据库或重新处理信息。

以亚马逊这样的电商应用为例,在黑色星期五促销期间,数百万用户会搜索热门优惠和畅销商品。

该应用程序无需每次搜索都查询数据库,而是可以将最受欢迎的产品及其详情缓存几分钟。这不仅缩短了用户的响应时间,还减轻了高峰流量期间数据库的压力。

缓存

 

🎯 您应该了解的缓存技术。

Application-Level Caching:Django 或 Express.js 等框架支持特定业务逻辑的内存缓存。

In-Memory Caching:非常适合会话数据、用户配置文件或任何需要低延迟的频繁访问数据。Redis 或 Memcached 非常适合这种情况。

Content Delivery Networks:Cloudflare 或 Akamai 等服务会将静态文件(例如图片、CSS、JavaScript)缓存到更靠近用户的位置。例如,亚马逊使用 CDN 几乎可以即时加载产品图片。

Client-side caching:将数据存储在客户端的设备(如网络浏览器)上,这可能会导致陈旧数据的问题,因为缓存的数据可能并不总是最新的。

Distributed caching:允许多台服务器共享存储和检索数据的工作负载。

缓存

 

然后还有一些缓存策略可以提高性能,例如:

Cache Aside (lazy loading):它首先检查缓存中是否有数据。如果数据不存在(缓存未命中),它会从数据库中检索数据,并将其填充到缓存中以供将来的请求使用。最小化缓存大小,并确保只存储频繁访问的数据。

Cache Invalidation:通过使用基于时间的过期或事件驱动的更新来更新陈旧数据。

Data Partitioning:根据特定标准(如用户 ID 或地理位置)对缓存进行分区。

Write Through:当数据更新时,会同时写入缓存和数据库。

Write Behind:数据先写入缓存,稍后再写入数据库。如果缓存管理不当,可能会导致不一致。

Adaptive Caching:根据实时数据访问模式、流量负载或使用的资源动态调整缓存策略。

Cache Aggregation:将多个缓存条目合并为一个统一的响应,减少多次查找的开销。主要用于 API 或微服务。

Cache Stampede Prevention:确保缓存过期时,对同一数据的多个请求不会压垮后端。诸如 、 或 之类的技术locking可以request collapsing提供early recomputation帮助。

还有许多其他策略,例如,,,Content-aware caching很多开发人员并不了解这些概念。Multi-Level CachingCache Warm-Up

如果你有兴趣了解更多,可以看看一篇关于缓存策略的非常有趣的文章,它介绍了各种缓存类型、缓存策略、实际案例,甚至还提供了使用这些技术的代码示例。强烈推荐!

有一个非常好的博客,介绍了系统设计面试的 9 种缓存策略

通过策略性地使用缓存,您可以扩展后端而无需消耗服务器资源。


😮 哇!光是扩展后端就需要实现这么多东西。真的值得吗?答案是肯定的。

我希望这些能为您扩展后端奠定坚实的基础。

祝你今天过得愉快!下次再见 :)

我还运营着一个面向开发者和技术作家的国际社区(超过 250 名成员),在那里我分享我学到的一切。你可以加入dub.sh/opensouls

你可以在anmolbaranwal.com
查看 我的作品 感谢阅读!🥰
叽叽喳喳 GitHub 领英

结尾挥手告别的 GIF

文章来源:https://dev.to/anmolbaranwal/7-steps-to-building-scalable-backend-from-scratch-fp8
PREV
🎁 快捷方式,以 100 倍速度查找开源项目
NEXT
开发人员快速构建后端的 7 种实用方法