使用 React、Nodejs 和 MongoDB 构建高性能全栈应用程序:可扩展性、速度和解决方案之旅

使用 react、nodejs 和 mongodb 构建高性能全栈应用程序:可扩展性、速度和解决方案之旅

您打开生产应用程序,发现它正在停止运行。前端没有响应。后端 api 超时。 mongodb 查询似乎无限期地运行。您的收件箱里充满了用户投诉。您的团队挤在一起尝试对情况进行分类。

去过吗?是的,我也是。

我是一名高级全栈开发人员,我厌倦了一些应用程序,这些应用程序在您仅作为单个用户使用时很好,或者问题空间很简单,但在实际流量或任务要求稍高。

请跟着我,我将向您介绍我如何使用 react、node.js 和 mongodb 解决这些问题。

我不会只是给你另一个简单的旧教程,我会分享一个故事。一个关于如何解决现实世界问题以及如何构建快速、高可扩展性应用程序的故事,该应用程序可以通过时间和任何挑战的考验。

1:当 react 成为瓶颈

我们刚刚在我的工作中推出了使用 react 开发的 web 应用程序的更新。我们充满信心,相信用户会喜欢这些新功能。

然而,不久之后我们就开始收到投诉:应用程序加载速度极其缓慢,转换时断断续续,用户变得越来越沮丧。尽管知道新功能很有用,但它们无意中导致了性能问题。我们的调查发现了一个问题:该应用程序将其所有组件捆绑到一个包中,这迫使用户每次访问该应用程序时都下载所有内容。

修复:我们实现了一个非常有用的概念,称为延迟加载。我以前曾遇到过这个想法,但这正是我们所需要的。我们彻底改造了应用程序的结构,确保它只在需要时加载必要的组件。

以下是我们如何实施此解决方案的一瞥:

const dashboard = react.lazy(() => import('./dashboard'));const profile = react.lazy(() => import('./profile'));<suspense fallback={
loading...
}>

结果:这一变化的影响是非常显着的。我们发现我们的捆绑包缩减了 30%,用户体验到了更快的初始加载速度。最好的部分是用户不知道应用程序的某些部分仍在加载,我们明智地使用了 suspense 并显示了一个简单的非侵入式加载消息。

2:驯服 react 中的状态管理猛兽

随着时间快进几个月,我们的开发团队正在大踏步前进并推出许多新功能。但随着业务的增长,我们无意中开始构建我所说的更复杂的应用程序。 redux 很快就成为促进简单交互的负担而不是助手。

所以,我花了一些时间创建一个 poc,以获得更好的替代方案。我记录了它的原理,并主持了多次知识共享会议,讨论该方法可能是什么样子。我们最终决定作为一个团队尝试使用 react hooks(特别是 usereducer)作为我们提出的管理状态的解决方案,因为最终我们想要更简单的代码和更少的大量运行时占用空间,而新版本的 redux 因许多较小的独立组件而导致开销不断增加状态。

接下来的转变简直就是革命性的。我们发现自己用简洁、易于理解的钩子逻辑替换了数十行样板代码。以下是我们如何实施这种新方法的说明性示例:

const initialstate = { count: 0 };function reducer(state, action) {  switch (action.type) {    case 'increment':      return { count: state.count + 1 };    case 'decrement':      return { count: state.count - 1 };    default:      throw new error();  }}const countercontext = react.createcontext();function counterprovider({ children }) {  const [state, dispatch] = usereducer(reducer, initialstate);  return (          {children}      );}

结果:这一转变的影响是深远的。我们的应用程序变得更加可预测并且更容易推理。代码库现在更精简、更直观,使我们的团队能够以更快的速度进行迭代。也许最重要的是,我们的初级开发人员报告说,他们浏览和理解代码库的能力有了显着提高。最终结果是双赢的:需要维护的代码更少,需要解决的错误更少,开发团队明显更快乐、更高效。

3:征服后端战场 – 优化 node.js api 以获得最佳性能

虽然我们能够对前端进行很多改进,但不久之后我们在后端遇到了多个问题。我们的 api 性能变得很糟糕,而且很少有端点开始表现得很糟糕。这些端点对不同的第三方服务进行一系列调用,并且随着用户群的不断增长,系统无法处理此负载。

这是非常常识性的问题:我们不是平行的!即,对每个端点的请求都是按顺序处理的,即每个下一个调用都将等待上一个调用完成。在这个大规模(数十万个请求)的系统中,事实证明这是灾难性的。

解决方案:为了解决这个问题,我们决定重写大量代码,并使用 promise.all() 的强大功能以并发方式发出 api 请求。这意味着您启动多个请求,而不必等到每个调用完成才启动下一个请求。

为此,我们不会启动 api 调用,等待其完成,再进行另一个调用等等……

不是简单地使用 promise.all(),所有内容都会立即启动,而且速度更快。

以下是我们如何实施此解决方案的一瞥:

const getuserdata = async () => {  const [profile, posts, comments] = await promise.all([    fetch('/api/profile'),    fetch('/api/posts'),    fetch('/api/comments')  ]);  return { profile, posts, comments };};

结果:此优化的影响是立竿见影且巨大的。我们观察到响应时间显着减少了 50%,并且我们的后端在重负载下的弹性显着提高。用户不再遇到令人沮丧的延迟,我们看到服务器超时的数量急剧减少。此增强功能不仅改善了用户体验,还允许我们的系统在不影响性能的情况下处理更多的请求。

4:mongodb 探索 — 驯服数据野兽

随着我们的应用程序获得关注并且我们的用户群数量级增长,我们不得不面对一个新的障碍:如何扩展其数据?当我们不得不处理数百万个文档时,我们曾经响应迅速的 mongodb 实例开始出现阻塞。过去以毫秒为单位运行的查询需要几秒钟才能完成,或者超时。

我们花了几天时间研究 mongodb 的性能分析工具,并发现了最大的坏蛋:未索引的查询。我们的一些最常见的查询(例如对用户配置文件的请求)正在扫描整个集合,他们可以使用坚如磐石的索引。

解决方案:根据我们掌握的信息,我们知道我们需要做的就是在那些最需要的字段上创建复合索引,这将永久修复我们的数据库正文查找时间。以下是我们在“用户名”和“电子邮件”字段中的做法。

db.users.createindex({ "username": 1, "email": 1 });

结果:此优化的影响非常显着。以前需要 2 秒才能执行的查询现在可以在 200 毫秒内完成,性能提高了十倍。我们的数据库恢复了快速响应能力,使我们能够处理显着增加的流量,而不会出现任何明显的速度下降。

但是,我们并没有就此止步。认识到我们的快速增长轨迹可能会持续下去,我们采取了积极措施来确保长期的可扩展性。我们实现了分片来将数据分布到多个服务器上。这一战略决策使我们能够横向扩展,确保我们处理数据的能力与不断扩大的用户群同步增长。

5。拥抱微服务——解决可扩展性难题

随着我们的用户群不断增加,越来越明显的是,我们不仅需要扩展我们的基础设施,而且还必须发展我们的应用程序,以便能够自信地扩展。当我们是一个较小的团队时,单体架构非常适合我们,但随着时间的推移,它变得相当麻烦。我们知道我们需要迈出一大步,开始构建微服务架构——这对任何工程团队来说都是一项艰巨的任务,但具有很大的可扩展性和可靠性优势。

最大的问题之一是服务之间的通信。 http 请求确实不适合我们的情况,它给我们的系统留下了又一个瓶颈,因为大量的操作都在焦躁地等待响应,并且在需要时杀死程序,因为有太多事情要做。此时我们意识到使用 rabbitmq 是显而易见的答案,因此我们没有考虑太多就应用了它。

以下是我们如何实施此解决方案的一瞥:

const amqp = require('amqplib/callback_api');amqp.connect('amqp://localhost', (err, conn) => {  conn.createChannel((err, ch) => {    const queue = 'task_queue';    const msg = 'Hello World';    ch.assertQueue(queue, { durable: true });    ch.sendToQueue(queue, Buffer.from(msg), { persistent: true });    console.log(`Sent ${msg}`);  });});

结果:从我们的角度来看,过渡本身以及通过 rabbitmq 进行的通信看起来就像魔术一样……数字证实了这一点!我们成为松散耦合微服务的幸运拥有者,其中每个服务都可以自行扩展。突然间,具体 dns 区域上的真实流量峰值并不涉及系统崩溃的担忧(因为无论哪个服务操作都会提出相同的要求,因为它们总是级联),而是工作得很好,因为其余部分/操作只是平静地举起手说“我可以睡觉了,亲爱的。”维护也变得更容易,问题更少,同时添加新功能或更新使操作更快、更自信。

结论:规划未来创新路线

这段激动人心的旅程中的每一步都是一个教训,提醒我们全栈开发不仅仅是编写代码。它理解并解决复杂的相互关联的问题——从让我们的前端更快、构建后端以承受故障,到处理随着用户群爆炸而扩展的数据库。

展望 2024 年下半年及以后,对 web 应用程序的需求增长不会放缓。如果我们继续专注于构建可扩展、性能优化和架构良好的应用程序,那么我们就有能力解决今天的任何问题,并在未来利用这些其他挑战。这些现实生活中的经历极大地影响了我进行全栈开发的方式——我迫不及待地想看看这些影响将继续推动我们的行业走向何方!

但是你呢?您是否遇到过类似的障碍,或者是否有幸通过其他创造性的方法来克服这些问题?我很想听听您的故事或见解 – 请在评论中告诉我或与我联系!

以上就是使用 React、Nodejs 和 MongoDB 构建高性能全栈应用程序:可扩展性、速度和解决方案之旅的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript ESelease 笔记:释放现代 JavaScript 的力量
上一篇 2025年12月19日 15:24:03
掌握 JavaScript Promise:Polyfill 和高级技术指南
下一篇 2025年12月19日 15:24:14

相关推荐

  • Spring Boot集成MongoDB Atlas:正确配置与故障排除

    本教程详细指导如何在Spring Boot应用中正确配置与连接MongoDB Atlas集群。我们将重点讲解如何获取并使用正确的Atlas连接URI,安全地处理用户认证信息,以及准确指定目标数据库。通过实例代码和常见错误排查,帮助开发者避免连接失败,确保应用与MongoDB Atlas的顺畅集成。 …

    2026年9月22日
    600
  • PHP 表单验证:确保 HTML select 下拉菜单已正确选择非默认选项

    本文将详细介绍如何在 PHP 后端对 HTML select 下拉菜单进行有效验证,确保用户选择了非默认选项。我们将探讨常见的验证误区,并提供一个简洁高效的解决方案,通过检查 $_POST 数据来判断用户是否已做出有效选择,从而避免表单提交无效数据,提升用户体验和数据准确性。 在构建 web 表单时…

    2026年9月22日
    200
  • Online Config VS Code

    Online Config VS CodeOnline Config VS CodeOnline Config VS CodeOnline Config VS Code

    run vs view Install Code Server Update Code Server Database:It is recommended to create a Docker container for the database. Code Language: JavaScript…

    2026年9月21日 用户投稿
    200
  • 《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    世嘉公开《如龙极3/如龙3外传  dark ties》官方中文版预告宣传片,将于2026年2月12日发售 ​​​​,登陆ps5/ps4/switch2/xbox/pc平台,全球同步推出。 ​​​ 在2009年于PS3平台发售的《如龙3》焕然重生,为您打造“极致体验”。鲜活真实的冲绳街景、震撼力升级的…

    2026年9月21日 用户投稿
    100
  • 《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    来源:官方 Nintendo Switch™ 2平台游戏《人中之龙 极2》(预计2025年11月13日发售)数字版已于今日9月24日正式开启预购。 同时,《人中之龙 极》与《人中之龙 极2》的PlayStation®5及Xbox Series X|S版本将于2025年12月8日推出。此次新版本将新增…

    2026年9月21日 用户投稿
    000
  • Java中字符到数字转换:解决for循环提前返回的常见陷阱

    本文探讨java中`for`循环在字符到数字转换时,因`return`语句放置不当导致程序提前终止、无法完整处理字符串的问题。我们将分析这种常见陷阱,并提供修正方案,演示如何正确利用循环填充数组,并在循环结束后统一返回最终结果,确保每个字符都能被准确映射和组合。 引言:字符到数字的映射需求 在编程实…

    2026年9月21日
    100
  • linux内核定时器实验

    linux内核定时器实验linux内核定时器实验linux内核定时器实验linux内核定时器实验

    大家好,又见面了,我是你们的朋友全栈君。 文章目录一、linux时间管理和内核定时器简介1.内核时间管理简介2.内核定时器简介1.init_timer 函数2.add_timer 函数3.del_timer 函数4.del_timer_sync 函数5.mod_timer 函数3.linux内核短延…

    2026年9月21日 用户投稿
    000
  • php switch语句怎么用_php中switch条件判断语句的用法示例

    答案:PHP中switch语句用于多条件判断,语法为switch(表达式){case值:代码;break;},通过松散比较匹配case值,执行对应代码块,遇到break跳出避免穿透,default处理无匹配情况。示例根据$day输出星期几,注意事项包括case值不可为表达式、需注意类型松散比较、省略…

    2026年9月21日
    200
  • 《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”

    《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”

    外媒comicbook报道,2025年是游戏界的辉煌之年,多款新作在metacritic上评分突破90分,并获得“必玩”徽章。 《哈迪斯2》以95分的成绩成为本年度评分最高的游戏,强势领跑年度最佳游戏(GOTY)的激烈竞争,独立游戏的全面崛起也成为今年最瞩目的行业亮点。 《哈迪斯2》:95分封神,战…

    2026年9月21日 用户投稿
    200
  • 《最终幻想7重生》制作人力挺NS2钥匙卡!开发者受益匪浅

    《最终幻想7重生》的联合制作人滨口直树(Naoki Hamaguchi)在最近接受Wccftech采访时,对任天堂Switch 2引入的游戏钥匙卡(Game Key Card)表达了积极态度。 他不仅回应了围绕该设计的争议,还大胆预测任天堂未来将大力推动这一新格式的发展,并指出其为游戏开发团队带来的…

    2026年9月21日
    000
  • Android Ksoap2序列化嵌套整数数组到.NET Web服务的解决方案

    本教程旨在解决Android Ksoap2在向.NET Web服务发送包含嵌套整数数组(如`ArrayList`)的自定义对象时遇到的序列化错误。核心解决方案包括将`ArrayList`替换为`Vector`,并为`Vector.class`添加显式Ksoap2类型映射,确保数据正确传输。 在And…

    2026年9月21日
    100
  • 夸克浏览器打开视频慢怎么办 夸克浏览器视频播放缓慢优化方法

    夸克浏览器打开视频慢怎么办 夸克浏览器视频播放缓慢优化方法夸克浏览器打开视频慢怎么办 夸克浏览器视频播放缓慢优化方法夸克浏览器打开视频慢怎么办 夸克浏览器视频播放缓慢优化方法夸克浏览器打开视频慢怎么办 夸克浏览器视频播放缓慢优化方法

    视频加载慢可通过优化网络、清理缓存、关闭省流模式及更新浏览器解决。优先使用稳定Wi-Fi或5GHz频段,关闭占用带宽应用;清除浏览数据释放性能;关闭省流加速与广告拦截避免误伤资源;及时更新至最新版本修复兼容性问题。 夸克浏览器打开视频慢,通常与网络环境、缓存问题或设置不当有关。想要提升视频加载速度,…

    2026年9月20日 用户投稿
    400
  • 如何在Laravel中配置多语言支持

    在laravel中配置多语言支持的核心步骤包括定义语言包、设置应用语言环境以及使用翻译函数。1. 创建语言文件:在resources/lang目录下为每种语言创建子目录(如en和zh-cn),并在其中定义php数组存储翻译字符串;2. 设置语言环境:通过config/app.php中的’…

    2026年9月20日
    000
  • 距发售仅剩一周!《无尽传说RE》Xbox实体版疑取消

    根据北美游戏零售商VGP发布的消息,《无尽传说 复刻版》Xbox平台的欧版实体版已在原定发售日前一周被正式取消。该零售商在Bluesky平台上发表声明表示:“我们遗憾地确认,已接到通知,《无尽传说 复刻版》Xbox Series X欧洲实体版本将不再推出。所有相关预订订单将会被取消,并启动退款流程。…

    2026年9月20日
    100
  • 任天堂Switch主机充电教程 教你如何为你的NS充电

    轻松掌握任天堂switch主机充电方法!很多新手玩家拿到switch后都会问:如何充电?别担心,本文将为您详细讲解switch的充电方式,让您快速上手。 主机电量显示:在主页菜单右上角,您可以找到电池图标,点击查看剩余电量百分比。 充满电时间:约3小时(主机休眠状态下)。 充电方法一:使用Ninte…

    2026年9月12日
    100
  • Java字符串加密:解决循环中提前返回导致的数字转换问题

    本文深入探讨java中将字符串转换为数字加密时,因`for`循环内不当的`return`语句导致程序提前终止,仅返回首个字符转换值的问题。通过分析原始代码的逻辑缺陷,提供了修正后的`getnumber`方法,确保所有字符都能正确处理并最终组合成完整的加密数字,并优化了`main`方法的调用逻辑,提升…

    2026年9月12日
    300
  • 任天堂switch被封禁BAN机错误代码大全 例如2181-4017、2124-4517

    如果您的任天堂switch显示以下错误代码,则表示您的主机已被封禁(俗称ban机): 很遗憾,目前没有办法解除此封禁,建议您购买一台新的switch主机。 以下是一些常见的Switch封禁错误代码及其原因: 2181-4017、2124-4517: 您的Switch主机因违反用户协议而被暂时禁止在线…

    2026年9月12日
    100
  • switch如何注册账号 任天堂NS游戏用户注册教程

    switch如何注册账号 任天堂NS游戏用户注册教程switch如何注册账号 任天堂NS游戏用户注册教程switch如何注册账号 任天堂NS游戏用户注册教程switch如何注册账号 任天堂NS游戏用户注册教程

    轻松注册你的任天堂switch账号,畅玩游戏!拥有任天堂账号才能下载游戏、保存存档等。准备好你的switch主机和网络连接,让我们开始吧! 首先,打开eShop,在账户界面点击“+”号添加新账户。 点击“下一步”继续。 选择你喜欢的头像。 输入账户名称。 点击“确定”。 如果你没有任天堂账号,选择“…

    2026年9月12日 用户投稿
    100
  • 《方舟生存飞升》新生物 “奥西顿” 首曝,11月中旬上线,《方舟终极生存者版》更新Switch 2

    《方舟生存飞升》新生物 “奥西顿” 首曝,11月中旬上线,《方舟终极生存者版》更新Switch 2《方舟生存飞升》新生物 “奥西顿” 首曝,11月中旬上线,《方舟终极生存者版》更新Switch 2《方舟生存飞升》新生物 “奥西顿” 首曝,11月中旬上线,《方舟终极生存者版》更新Switch 2《方舟生存飞升》新生物 “奥西顿” 首曝,11月中旬上线,《方舟终极生存者版》更新Switch 2

    阿拉特主星的极寒地带即将迎来一位全新霸主——由红色元素重塑、象征极致耐力与元素之力的巨型灵长类生物“奥西顿”,将于太平洋时间11月18日正式降临《方舟:生存飞升》。 曾被视作“失败的实验体”,如今的奥西顿已蜕变为掌控“冰封炼金术”的强大存在。它能在连泰坦都难以立足、“重生协议”也无法覆盖的极端环境中…

    2026年9月12日 用户投稿
    100
  • 《刺客信条:影》将于12月2日登陆Switch 2

    在经历了数月的猜测后,育碧终于正式宣布《刺客信条:影》将登陆switch 2平台。 《刺客信条:影》Switch 2版本确定于12月2日发售,支持触屏操作,让玩家能够更便捷地浏览菜单、地图以及管理藏身处。 该版本将包含游戏发售后在其他平台推出的所有更新内容,但不包括“淡路之爪”资料片,该DLC预计将…

    2026年9月12日
    300

发表回复

登录后才能评论
关注微信