这篇文章主要总结两个图谱:Node 的事件轮询机制图谱和 Node 作为中间层在大型应用下的架构图谱。
注:文中的内容大多是我自己的理解,并不一定正确,如果您在阅读的过程中发现了任何错误,欢迎告诉我,以便改正。
Event Loop 和异步 IO
关于 Event Loop 和异步 IO,可以参考这两篇文章:
Node 的事件轮询机制图谱
Node 的事件轮询机制图谱如下:
图谱说明:
- Node 服务器收到客户端的请求,先将请求保存在一个队列中
- 将请求假如到 Event Loop
- Event Loop 通过 Libuv 库向操作系统发出指令,并注册回调函数(具体的任务交给 Libuv 调度,Event Loop 不负责具体的任务实现,如 IO 读取)
- Libuv 是 C++ 的一个处理异步任务的模块,其对 Linux 和 Windows 平台进行了兼容
- Libuv 将任务分发给具体的工作线程,工作线程负责执行任务
- 工作线程执行任务完毕后,通知 Libuv
- Libuv 收到任务完成的通知后再通知 Event Loop,触发先前注册的回调函数
- 回调函数执行完成后,移除请求队列中的相关请求
以 Node 为中间层的架构图谱
下面是一个以 Node 为中间层的架构图谱:
图谱说明:
- 客户端发起请求,首先由 Nginx 进行负载
- Nginx 将请求转发到某台 Node 服务器后,由该服务器上的 PM2 等管理软件选择一个合适的进程处理请求
- 同时,Node 服务还可以对静态资源进行处理,将静态资源请求重定向到某台 CDN 上
- Node 向后端发起请求
- Node 不直接请求 Java 服务器,在 Node 和 Java 集群之间设置一个 HTTP 的缓存,Node 从缓存中获取数据,缓存一般由 Varnish 或 Squid 完成
- HTTP 缓存和 Java 服务器之间要保持连接,一般可以通过心跳确认连接状态,如果和某台服务器连接出现了异常,就要进行处理
- Java 服务器从数据库集群中读写数据
- 数据库集群进行了读写分离
- 同时,还需要对数据库进行冷热备份操作,以进行容灾
上面就是使用 Node 作为中间层的一个比较大型的应用的架构图谱。
完。