怎么就敢用NodeJS写千万级别的服务后端

news2025/7/7 1:46:57

前言:NodeJS真的是玩具吗?真有人敢用这个玩具来写后端服务,它能支撑成一个千万级别的用户量级吗?怎么就带着我的团队稀里糊涂把这事而且做成。这篇文章将分享这次项目的并发实践经验。

一、项目背景

老板说:公司要搞战略NPS,需要一套问卷系统。要能配置问卷和回收答案就行,后端木有资源,给个机会前端搞全栈哈,先简单搞哈,早期没啥量,不用慌哈,看好你们哟。

写个问卷系统,将它分成两个部分就行。

  • 问卷配置管理端:不就是一个内部系统,公司内部人用,有啥量的,问题不大。(不在本文内容讨论范围)

  • 问卷服务:要给用户访问的呀,要做高并发呀。早期不是没啥量嘛,先用NodeJS写,等并发起来后,如果搞不定再让后端接锅😄呗,再说业务能不能起来都很难说,(反正人和代码有一个能跑就行😂)

难得有一个机会可以搞全栈而且还要一定的用户体量,虽然很慌,但是,还是很有干劲的呀😁

二、系统架构

有一个搞全栈的机会,虽然很慌,但是,还是很有干劲的呀😁,消化老板的大饼,是时候要开干了。

设计一个架构图,再找有经验的后端大佬们过一下。

上图黄色部分是配置问卷的管理的模块,右边绿色部分问卷对外的服务模块,在整个架构全局来看,需要支持并发的其实只有两个模块:

  • GET 问卷页面渲染模块
  • POST 答案上报模块

三、应对之策

按照问卷回收经验来说,大概,10个问卷页面浏览 > 才会有1答案上报 处理并发要命的是页面读接口,其次是答案上报的写接口。并发处理开干了。

3.1 页面渲染并发处理

渲染运营配置的问卷页面,并发量是整个toC流量最大的,最具有挑战难度的。 接下来通过拆解整个接口的过程,然后使用多级缓存策略和改进的CSR来解决并发难题。

3.1.1 渲染流程

渲染前,需要获取到数据库运营配置问卷的题目相关的信息

  • pageData,每个问卷配置的内容不一样,运营啥时候修改问卷也不知道,需要在数据库拉去配置对应问卷ID的配置给到前端来渲染页面;(页面级别的数据,变更不可控

  • render是一个JS渲染库,所有问卷都是一样,只要不发布版就不会更新,放到CDN来扛并发即可。(应用级别的数据,变更可控

3.1.2 页面数据缓存策略

pageData是页面数据,虽然要实时来取,但是可以做适当的缓存策略。拉去pageData读接口采用了多级缓存,流程如下:

  • 首次通过远程调用取读取内部管理的问卷配置数据;
  • 渲染页面完成,写入内存缓存和Redis缓存;
  • 下次渲染,先按照内存 > redies缓存读取,没有再重复首次访问逻辑。

通过设置多级缓存,减少mysql的并发压力和页面加速😄

3.1.3 渲染模式

为了向并发妥协,没有使用服务器端渲染。

我们选择了CSR。

但是,为了页面性能更好,我们改进CSR模式,把本来要读pageData接口和html框架页面放到服务器端合并起来。

/**
* html拼接方法
* @param pageData,问卷题目配置数据
* @param resouceInfo,前端资源版本控制,由服务端控制做长缓存更新使用
*/
function render(pageData,resouceInfo){
 const html = `<!DOCTYPE html>
 <html lang="en">
 <head>
  <title>${pageData.title || '问卷'}</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-COMPATIBLE" content="IE=Edge,chrome=1">
  <meta name="nightmode" content="disable">
  <link rel="shortcut icon" type="image/x-icon" href="//wenjuan-static-cn.heytapimage.com/wj-prod/faviconIcon.ico" id="favicon">
  <!--问卷页面样式文件-->
  <link href="${resouceInfo['main-css']}"  rel="stylesheet">
  <!--babel垫片-->
  <script content="babel-polyfill" nomodule  src="${resouceInfo['babel-polyfill']}"></script>
  <!--vue全家桶-->
  <script content="vue-all" src="${resouceInfo['vue-all']}"></script>
 </head>
 <body ${bodyStyle}>
  <div id="app"></div>
    <script content="page-data">
      // pageData 直出到页面并挂在在window,方便vue使用
      window.asyncData = ${JSON.stringify(pageData)};
    </script>
    <!--问卷页面入口js-->
    <script content="main-js"  src="${resouceInfo['main-js']}"></script>
  </body>
  </html>`
  
  return html
}
复制代码

改进的CSR模式,在不增加服务器负载的情况下,减少了数据读取过程,将getPageData接口和html合二为一。页面在浏览器渲染,不用在请求后端接口获取pageData,首屏渲染速度更快!!!

3.2 上报接口并发处理

问卷答案上报接口,虽然量只有上面渲染接口的1/10,但是它是个写接口,从外网流量写入是内部系统服务的(恐慌.jpg)。

借助kafka解耦后,并发请求带来可以向后借时间,这就解决写入的瓶颈和系统负载。

  • 通过调节kafka消息消费的速度,让内部管理的也可以应对ToC的问卷答案上报流量的写入操作。
  • 解决系统负载,原本三个串行任务的耗时重计算任务放在并发处理中,改到只留数据补齐和校验任务,另位两个放到消费数据再执行,达到向后借时间目的。

四、达到效果

总算开发完成了, 老板说:给你们找到了一个业务来用,他们后天要投X千万用户,要走PUSH渠道,你们接一下。

啊!啊!啊!这?不是说早期没啥量吗?😢咋一上来就x千万用户呢?还是走PUSH渠道

最后线上效果如下:

注:部署了4台8G16核的容器主机。

五、总结

这次项目用到redis、kafka、mysql完成由云平台提供,就是买买买就行,随着各种数据库和中间件上云交付,前端写后端已经完全可行。而且像小程序云这种成熟的FASS云设施普及,把后端代码也可以写到前端里去写也越来越多,前端人,已经不再是切图仔了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【K8S系列】第七讲:有状态服务 VS 无状态服务

目录 序言&#xff1a; 1.无状态服务介绍 2 有状态服务介绍 2.1 稳定的网络标识 2.2 稳定持久化存储 3 总结 序言&#xff1a; 昨天有位大佬&#xff0c;问这个问题 ……………………………………………… 决定学习之后&#xff0c;有了这篇文章. 1.无状态服务介绍 1.数…

CSS中clip-path、white-space使用

clip-path clip-path属性可以创建一个只有元素的部分区域可以显示的剪切区域、之前大部分都是使用 overflow: hidden border-radous 来实现一些布局 使用 clip-path 可以按需更简便的完成。 clip-path: polygon 多边形显示 里面输入坐标值 左上角为原点&#xff0c;右下角…

工程师新红利,我国预计到2025年培养20万名这类人才

前 言 近段时间&#xff0c;受到众所周知的事件影响&#xff0c;国外半导体企业掀起一股裁员潮。据《日经亚洲评论》报道&#xff0c;当外资公司正在收缩中国业务时&#xff0c;中国科技企业借此正竭力争夺外资企业中的成熟工程师。这足以说明一点&#xff0c;国内对成熟工程…

三剑客之 grep

目录基本参数正则表达式本文参考文献&#xff1a;GNU Grep 3.8 grep 是一个在 UNIX 上的命令行工具&#xff0c;它通过给定的模式&#xff08;pattern&#xff09;来搜索一个输入文件&#xff0c;并输出匹配到这些模式的内容 grep 于1974年公开&#xff0c;是文本三剑客中最早…

ROS总结理解

机器人操作系统入门_中科院软件所-重德智能机器人联合研究中心_中国大学MOOC(慕课) 可以参考视频学习 目录 .1ROS版本 .2 ROS架构 .3 ROS与IDE安装 .4 Catkin与工作空间 5.ROS的Package结构 6.ROS的常用指令 7.Metapackage 8.Master和Node .9 Topic和msg .10 Servic…

css 改变下划线长度,伪元素模拟border-bottom

要实现文字下方下划线 1 border-bottom配合width <html><head><style>p {border-bottom: 1px solid red;}</style> </head><body><p>选中内容</p> </body></html>直接设置border-bottom&#xff0c;会由于p标签…

vue3使用element-plus

1、下载包 npm install element-plus --save 2、引入 全局引入挂载&#xff1a;引入记得有css文件&#xff08;下载不下来可能是项目正在运行&#xff0c;先关掉&#xff09; import { createApp } from vue import App from ./App.vue import ElementPlus from element-plus …

MySQL 主从复制

现在我们的应用基本都往高性能的方向发展&#xff0c;各种语言都开始推出一些多进程和分布式的框架&#xff0c;其目的就是为了能够做到一个高性能的应用。包括会使用各种MQ和缓存的中间件&#xff0c;其实使用这些中间件的最终目的都是为了能够缓解数据库的压力&#xff0c;数…

下载离线地图地形数据库(3D离线地图开发)

下载离线地图地形数据库&#xff08;3D离线地图开发&#xff09; 发布时间&#xff1a;2020-03-03 版权&#xff1a; 离线地形&#xff1a;是用来表示地表高低起伏的一种三维地形数据库&#xff0c;有了这个地形数据&#xff0c;才能真实的反应出地球表面的高低起伏状态&#…

Docker安装Nginx并修改Nginx配置文件

一、Docker安装Nginx 1、首先在虚拟机上要确保你已经启动了docker。 2、其次登录DockerHub官网&#xff0c;然后搜索nginx&#xff0c;,然后在虚拟机里面输入docker pull nginx,就可以下载nginx的镜像了。 3、注意下载完以后要使用docker images指令查看一下是否下载成功了&am…

市场调查与分析[市场调查员][抽样技术方案][抽样方法][F检验]

正大杯比赛最新参考题&#xff08;预测含必考&#xff09; - 知乎 目录 A市场调查员 B抽样技术方案 一、调查目的、范围、对象及内容 二、抽样方案设计的原则与特点 三、样本区、县的选取 3.1全国区、县的调查总体 3.2区、县分层 (1)地域 (2)区、县类别 四、各阶…

怎么复习信息系统项目管理师?

废话不多说~ 正文开始~ 一、备考前期准备 1、合理规划时间&#xff0c;把握备考节奏 大家在网上经常会看到&#xff0c;考软考高级很简单&#xff0c;说是1个月就可以。 确实现实中存在大神&#xff0c;况且运气还占据一定比例&#xff0c;人家能上&#xff0c;咱真的不一…

鼎医信息加入PolarDB开源数据库社区

近日&#xff0c;上海鼎医信息技术有限公司签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手。 过去 5 年&#xff0c;阿里云针对 PolarDB 进行了诸多创新&#xff0c;通过采用存储计算分离、软硬一体化设计&#…

SREWorks v1.3 版本发布 | 插件机制发布

在v1.2版本发布之后&#xff0c;SREWorks团队着手开始了v1.3版本的迭代。此次v1.3版本融合了较多用户需求&#xff0c;以及对底座机制进行了较大调整和优化&#xff0c;故发版时间长了很多。下面让我们切入正题&#xff0c;来看看这些大变化究竟是哪些&#xff1f; 1. 插件机制…

Web3——开发第一个智能合约

学习写第一个智能合约&#xff0c;下面连接是集成开发环境 https://github.com/smartcontractkit/full-blockchain-solidity-course-js#lesson-2-welcome-to-remix-simple-storage 点击 “Remix” 来到Remix IDE&#xff0c;这就是我们要写代码的地方&#xff0c;集成开发环境…

一文入门mybatis-plus

mybatis-plus mybatis-plus官网 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生. 可以说呢&#xff0c;在MP基础上还可…

一次想不到的 Bootstrap 类加载器带来的 Native 内存泄露分析

最近我们线上有同学反馈&#xff0c;java 服务在接入了支持预发的 javaagent 以后会出现缓存的内存增长&#xff0c;去掉 agent 启动以后内存增长正常。于是分析了一下这个问题&#xff0c;写了这篇文章。 备注&#xff1a;JVM 堆内存最大 1000M 主要会涉及下面这些内容&#…

防火墙基础技术

目录 一、内容概述 二、防火墙概述 防火墙的应用 防火墙的本质 防火墙的发展历程 防火墙特征 防火墙分类 包过滤防火墙&#xff1a; 包过滤防火墙的缺点&#xff1a; 代理防火墙&#xff1a; 代理防火墙的缺点&#xff1a; 状态检测防火墙&#xff1a; 状态检测防火…

【Linux修炼手册:基本指令(下)】

目录 1 man指令&#xff08;重要&#xff09; 2 more指令 3 less指令&#xff08;重要&#xff09; 4 head指令和tail指令 5 时间相关的指令 6 Cal指令 7 find指令&#xff1a;&#xff08;灰常重要&#xff09; -name 8 grep指令 9 zip/unzip指令 10 其他常见命令 1…

SiPM使用总结

1、SiPM的电子模型 首先我们来看一下二极管的雪崩电子模型&#xff0c;电子模型和雪崩时的电流波形如下图所示&#xff0c; 电流上升的快慢是由电容的充放电速度决定的&#xff0c;充电的时常数TdRS*Cd&#xff0c;放电的时常数 TqRq*Cd&#xff0c;这里Rq>>Rs&#xf…