iOS开发笔录node.js 学习

深入浅出Nodejs之笔记

2019-12-02  本文已影响0人  lmmy123

深入浅出Nodejs

模块机制

异步I/O

node的方案:

​ 单线程 + 非阻塞异步 I/O

​ child_process / cluster模块提供多进程,可以利用多核cpu

非阻塞I/O,为了获取i/o响应的数据,需要重复调用i/o是否完成 — 轮询

理想的非阻塞异步I/O

node event loop

process.nextTick 会优于其他microtask执行

异步编程

函数式编程

内存控制

V8的垃圾回收机制和内存限制
高效实用内存

buffer对象不经过v8的内存分配机制,不会有堆内存的大小限制,利用堆外内存可以突破内存限制的问题

内存泄漏
内存泄漏排查
大内存应用

不可避免还是会操作大文件的场景,使用stream模块,继承EventEmitter,具备事件功能

由于v8的内存限制,使用fs.createReadStream/createWriteStream 替代fs.readFile/writeFile

不考虑字符串的情况下,使用buffer, buffer不受v8堆内存的限制

Buffer

内存分配

buffer对象不占用v8的堆内存中,便于处理大量的字节数据,在c++层申请内存,在js中分配内存的策略

slab分配机制

buffer的转换

buffer的拼接

setEncoding(encoding)

buffer与性能

通过预先将静态内容转为buffer对象,可以有效减少cpu的重复使用,节省服务器资源

网络编程

node提供了net,dgram,http,https模块用于搭建服务器

构建web应用

<form action='/upload' enctype='multipart/form-data'></form>

页面渲染

//简易模版函数,主要是正则匹配
var render = function(str, data) {
    var tpl = str.replace(/<%=(.*)&>/g, function(str, code) {
        return " '+ obj." + code + "+ '"
    })
    tpl = "var tpl = '" + tpl + "'\nreturn tpl;"
    // Function中tpl为模版, obj为参数
    var complied = new Function('obj', tpl)
    return complied(data)
}

​ 1.with的应用

var complie = function(str, data) {
    var tpl = str.replace(/<%(.*)%>/g, function(all, code) {
        return "'+" + code + "+ '"
    })
    tpl = "tpl = '" + tpl + "'"
    tpl = 'var tpl = "";\nwith(obj) {' + tpl + '}\nreturn top;'
    return new Function('obj', tpl)
}

​ new Function ([arg1[, arg2 [,...argN]]], fnBody)

​ 2.模版安全

​ 转译函数

var escape = function(html) {
    return String(html).replace(/&(?!\w+;)/g, '&amp;')
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        .replace(/"/g, '&quot;').replace(/'/g, '&#039')
}

​ 3.模版逻辑

​ 4. 集成文件系统, 引入缓存,避免多次重复编译

​ 5. 子模版 include

玩转进程

​ 进程: cpu资源分配的最小单位 (工厂)

​ 线程: cpu调度的最小单位 (工人)

nodejs : v8引擎,单线程

单线程的缺点:不能发挥多核cpu的优势,抛出的异常未被捕获处理,会造成进程退出,健壮性和稳定性低

优点: 没有多线程上下文切换的问题,提高cpu的使用率,没有锁,线程同步问题

服务模型的变迁

负载均衡

多进程之间监听相同的端口,使用户请求能够分散到多个进程上进行处理,保证多个进程处理的工作量公平的策略就叫负载均衡

将cpu资源都调用起来

node默认提供的机制是采用操作系统的抢占式策略,就是闲置的进程对请求进行抢夺,谁抢到谁服务,它的繁忙由cpu和i/o构成,影响抢占的是cpu的繁忙度,有可能存在cpu空闲,但是i/o忙的情况,这样去抢占服务,会形成负载不均衡

node v0.11提供了新的策略, Round-Robin(轮叫调度),由主进程接收请求服务,依次发给工作进程

//启用round-robin
cluster.schedulingPolicy = cluster.SCHED_RR
// 不启用
cluster.schedulingPolicy = cluster.SCHED_NONE

状态共享

cluster模块

​ 创建单机node集群

//cluster.js
var cluster = require('cluster')
cluster.setupMaster({
    exec: 'worker.js'
})
var cpus = require('os').cpus()
for(var i = 0; i< cpus.length; i++) {
    cluster.fork()
}

执行node cluster.js, 和上面用child_process创建子进程集群效果相同

Cluster.setupMaster() /cluster.fork()创建子进程

cluster原理

cluster 事件

测试

异步测试

产品化

项目工程化

项目的组织能力

上一篇 下一篇

猜你喜欢

热点阅读