Articles icon indicating copy to clipboard operation
Articles copied to clipboard

经验文章

Results 103 Articles issues
Sort by recently updated
recently updated
newest added

## 前言 `进程`与`线程`是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解`进程`与`线程`,并且讲解一些在项目中的实战的应用,让你不仅能迎战面试官还可以在实战中完美应用。 ## 文章导览 ![](https://user-gold-cdn.xitu.io/2019/8/8/16c6cf612c275894?w=2772&h=1104&f=jpeg&s=377258) ## 面试会问 > Node.js是单线程吗? > Node.js 做耗时的计算时候,如何避免阻塞? > Node.js如何实现多进程的开启和关闭? > Node.js可以创建线程吗? > 你们开发过程中如何实现进程守护的? > 除了使用第三方模块,你们自己是否封装过一个多进程架构? ## 进程 进程`Process`是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器(来自百科)。进程是资源分配的最小单位。我们启动一个服务、运行一个实例,就是开一个服务进程,例如 Java 里的 JVM 本身就是一个进程,Node.js 里通过...

对于 Node.js 服务端研发的同学来说,关于垃圾回收、内存释放这块不需要向 `C/C++` 的同学那样在创建一个对象之后还需要手动创建一个 `delete/free` 这样的一个操作进行 **GC(垃圾回收)**, Node.js 与 Java 一样,由虚拟机进行内存自动管理。 但是这样并不表示就此可以高枕无忧了,在开发中可能由于疏忽或者程序错误导致的内存泄漏也是一个很严重的问题,所以做为一名合格的服务端研发工程师,还是有必要的去了解下虚拟机是怎样使用内存的,遇到问题才能从容应对。 ## Nodejs 中的GC Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,这是来自 Node.js 官网的一段话,所以 V8 就是 Node.js 中使用的虚拟机,在之后讲解的 Node.js...

**RPC**,远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的上的程序。通俗讲,RPC 通过把网络通讯抽象为远程的过程调用,**调用远程的过程就像调用本地的子程序一样方便,从而屏蔽了通讯复杂性,使开发人员可以无需关注网络编程的细节**,将更多的时间和精力放在业务逻辑本身的实现上,提高工作效率。 **RPC** 本质上是一种 **Inter-process communication(IPC)**—— 进程间通信的形式。常见的进程间通信方式如管道、共享内存是同一台物理机上的两个进程间的通信,而 **RPC** 就是两个在不同物理机上的进程之间的通信。概括的说,RPC 就是在一台机器上调用另一台机器上的方法,这种调用在远程机器上对代码的执行就像在本机上对代码的执行一样,只是迁移了一个执行环境而已。 **RPC** 是一种 C/S 架构的服务模型,**server 端**提供接口供 **client端** 调用,client 端向 server 端发送数据,server 端接收 client 端的数据进行相关计算并将结果返回给 client 端。 ![rpc_procedure](http://img.pfan123.com/rpc_procedure.png) 为了实现上述 RPC...

## Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效 在 ` ~/.bash_profile` 中配置环境变量, 可是每次重启终端后配置的不生效.需要重新执行 : ` $source ~/.bash_profile` 例如设置 cairo 环境变量 ``` For compilers to find libffi you may need to set: export LDFLAGS="-L/usr/local/opt/libffi/lib"...

# Node服务性能监控 目前许多业务开始往前端进行迁移,BFF(backends for frontends)的概念很多团队已开始逐渐尝试。让后端专注于提供统一的数据模型,将业务逻辑迁移到基于 Node 的 BFF 层中,让前端提供 API 接口,节省前后端联调成本,促使后端提供的 RPC 或者 HTTP 接口更加通用,减少修改后端工程,加快开发的效率。 但在 BFF 架构中,非常依赖 Node 端的稳定性,一旦 Node 端发生错误导致阻塞,造成很严重的后果,所以 Node 端的性能监控越来越有必要。 > 可以结合一些传统平台比如 [sentry](https://github.com/getsentry/sentry)、 [zabbix](https://github.com/zabbix/zabbix) 可以帮助构建稳定的前端实时监控部署环境。 ##...

## 前端测试工具一览 前端测试工具也和前端的框架一样纷繁复杂,其中常见的测试工具,大致可分为测试框架、断言库、测试覆盖率工具等几类。在正式开始本文之前,我们先来大致了解下它们: ### 测试框架 测试框架的作用是提供一些方便的语法来描述测试用例,以及对用例进行分组。 测试框架可分为两种: TDD (测试驱动开发)和 BDD (行为驱动开发),我理解两者间的区别主要是一些语法上的不同,其中 BDD 提供了提供了可读性更好的用例语法,至于详细的区别可参见 [The Difference Between TDD and BDD](https://link.juejin.im?target=http%3A%2F%2Fjoshldavis.com%2F2013%2F05%2F27%2Fdifference-between-tdd-and-bdd%2F) 一文。 常见的测试框架有 [Jasmine](https://link.juejin.im?target=https%3A%2F%2Fjasmine.github.io%2F), [Mocha](https://link.juejin.im?target=https%3A%2F%2Fmochajs.org%2F) 以及本文要介绍的 [Jest](https://link.juejin.im?target=http%3A%2F%2Ffacebook.github.io%2Fjest%2Fzh-Hans%2F) 。 ### 断言库 断言库主要提供语义化方法,用于对参与测试的值做各种各样的判断。这些语义化方法会返回测试的结果,要么成功、要么失败。常见的断言库有 [Should.js](https://link.juejin.im?target=https%3A%2F%2Fshouldjs.github.io%2F),...

## 高并发   高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证**系统能够同时并行处理很多请求**。 高并发相关常用的一些指标有**响应时间RT**(Response Time)、**吞吐量**(Throughput)、**每秒查询率** QPS(Query Per Second)、**每秒事务处理率** TPS (Transactions Per Second)、**并发用户数**等。 - **响应时间**:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。 - **吞吐量**:单位时间内处理的请求数量。 - **QPS**:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。 - **TPS**: 每秒事务数,它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。 - **RT**: 响应时间,执行一个请求从开始到最后收到响应数据所花费的总体时间,即从客户端发起请求到收到服务器响应结果的时间。 - **并发用户数**:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。   从服务端视角看高并发服务端处理请求需要耗费服务端的资源,比如能同时开启的进程数、能同时运行的线程数、网络连接数、CPU、I/O、内存等,由于服务端资源是有限的,那么服务端能同时处理的请求也是有限的。   高并发问题的本质就是:资源的有限性 ###...

![sketch](http://img.pfan123.com/sketch-plugins.jpg) Sketch 是非常流行的 UI 设计工具,2014年随着 Sketch V43 版本增加 Symbols 功能、开放开发者权限,吸引了大批开发者的关注。 目前 Sketch 开发有两大热门课题:① [React 组件渲染成 sketch](https://github.com/airbnb/react-sketchapp ) 由 airbnb 团队发起,② 使用 [skpm](https://github.com/skpm/skpm) 构建开发 Sketch 插件。 Sketch 插件开发相关资料较少且不太完善,我们开发插件过程中可以重点参考官方文档,只是有些陈旧。官方有提供 JavaScript API 借助...

## 异步I/O与事件驱动 Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。 对于高并发的解决方案,传统的架构是**多线程模型**,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。 **Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换**。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。 例如,对于数据库请求,传统的思维是这样写的话, 后面的 res.output() 需要等到数据库查询完毕才能执行。 ```js res = db.query('SELECT * from some_table') res.output() ``` >...

[Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局 [`fetch()`](https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalFetch/fetch) 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。 ```js fetch(String url, [, Object options]).then(function(response) { ... }).catch(err => {}) ``` 目前,浏览器端原生获取数据,发请求的主要是 `XMLHttpRequest` 和 `fetch`,`XMLHttpRequest` 作为元老级的存在, `fetch` 是在 ES6 中推出的更现代的...