大规模Node项目架构和优化

这节课我们要讨论什么

1、NodeJs异步IO原理浅析及优化方案

2、nodejs内存管理机制以及内存优化

3、大规模node站点结构原理分析

4、服务器集群管理和node集群的应用

5、UV过千万的Node站点真身

异步IO原理浅析

NodeJS异步IO原理浅析及优化方案

io就是输入和输出 input output

io密集型 一堆请求像你袭来 这个时候node全部接受 基于异步的处理机制

cpu要进行紧急运算

io是昂贵的

cup是昂贵的 因为运算特别快

cpu时钟周期  1/cpu 越

cpu分成两级缓存 一级缓存和二级缓存

内存缓存 member cache

缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。

Memcached是什么?

Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

js和java不在一台服务器上 分布式服务器 通过网络进行请求 并在硬盘上找到文件 但是对于取到js文件时间更加长了 a.xx.com js访问 b.xx.com java

ws同步处理的任务 wp异步的任务

异步io创建出文件描述符后,等待系统底层处理后在扔回去

app就是application就是应用程序的简称 通过js代码绑定到v8的进程中 浏览器和v8引擎不支持es6  v8引擎通过nodejs基础的api 电饭锅饭好了会叫 被node封装了一层libuv 也叫asynchronous io node封装的一种异步通知的机制,eventloop 事件从event queue(事件队列)中 交给worker therads(工作线程)执行完毕后告诉eventloop 交回eventqueue(看nodejs事件驱动机制)

AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。

NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。

从服务器上看node

Nginx负载均衡代理到lvs

 pm2负载均衡去启动node 可以帮助零秒热启

pm2 是一个带有负载均衡功能的Node应用的进程管理器.

帮助事件轮询的libuv库和v8不是一个线程 

libuv封装了两个东西在linux下叫custom threradpool 在windows 叫iocp

nodejs代码单线程 cluster启动多个服务 fork启动一个服务复制多个 主进程死了其余都崩溃 两种机制

哨兵变量

v8的垃圾回收策略基于分代式垃圾回收机制:新生代为存活时间较短的对象,老生代为存活时间较长的对象,gc是一种回收机制,来区分出新生代和老生代,scavenge算法,把内存一分为二,var a alert(a) var b ,此时b没有用到,把代码进行反转,var a alert(a),把a放到老生代空间内,老生代空间越来越多,也需要清理,a=null,把空间标记为星,把有用变量挪到一起,带星的删除。即先把变量放到老生态空间,在通过标记清除移动的方法,把老生态空间没用的内存干掉,跟磁盘碎片清理相似。

net多层架构

website 前端代码 html css js代码

webstieTest 单元测试文件夹

webService 外界提供接口

webControllers 路由

SQLServerDAL 数据库的一些具体的操作

Model 数据库对应的模型

IDAL 接口 不干活

DLLLlbraly 第三方的库

DBUtility 数据库封装的库

DataCache 一些缓存 

DALFactory 最重要

BLL 真正干活 把IDAL接口层和SQLServerDAl连接起来 真正的路由落到BLL上

JavaWeb多层架构

action 路由层

common 公共的类

dao 数据库的实现层

po 数据库的类

service 实现数据操作的

依赖注入 控制反转

pm2 0秒停机重启

服务器集群

NGINX LVS 

前端项目构建

dosc 前端项目

nodeuii node项目

scripts 运行脚本

webapp build脚本build到nodeuii中

nodeuii中包含

app.js 启动文件

bin 脚本

config 配置文件

controllers 路由

lib 常用的帮助库

middleware 中间件

models 和后端请求用的

nginx-conf  nginx配置文件

node_modules node包

package.json 包管理器

pm2.json pm2的配置文件

public 公共的前端资源配置文件

receiver-master  接收前端传过来的receiver

test 功能化测试

views 模板

    原文作者:一个抹布向前1
    原文地址: https://www.jianshu.com/p/bed1439266cd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞