• 选型

      • 语法可难可易,可根据团队的实际情况灵活选择。编码的三个阶段分为面向过程,面向对象,函数式编程

      • 开发大型软件

        • 基础条件包括: 测试,代码质量和规范,构建,代码生成,包管理

        • 开发大型软件,生态包括:具备基础,云计算公司都支持,大厂都有大量的应用,生态完善(调优方面有node-clinic,alinode)

      • 特定场景下的开发

        • 写法上可难可易

        • 可扩展为大型软件

        • 可快可慢

    • 稳定性,可用性

      • 背景:异常如何处理,尤其高并发如何支持

      • 全局捕获:进程的uncaughtException事件 可以避免大多数的问题(类似于前端里的window.onerror)

      • 异常捕获,针对程序的捕获是基本规范,常规情况下,

        • 对于同步的程序我们可以通过try/catch进行捕捉,但这个的成本比较高,因此我们更建议抛出准确的错误;

        • 对于异步的程序,更建议使用promise,以及promise的错误处理方案

      • 风险的预案,进程因为异常退出非常常见,因此重启变成了基本的方案,比较推荐的有forever

        • 全局安装

        • 崩溃时,使用

        • 目前最新的方案是pm2

      • 小集群:单服务器上的多个实例

        • 背景,一般服务器都是多核的,所以可以有cluster模块用来解决多核并发的问题,可以多个机器上创建多个实例

        • 类比,nginx的集群设计是一主多从,主机的端口通过复杂均衡算法把要求转发到slave机器。

        • pm2,可以创建多个实例,然后检测到崩溃之后自动重启,支持无缝重载,0s切换等,可以实现各种监控,部署等功能

      • 大集群:多台机器

        • 基本上,通过slb来做负载均衡,负载层把请求转发到负载中可用的节点服务器上(建议分发时增加head请求来判断这个节点是否是可用状态的)

        • 单线程会死,是伪命题,大多数问题是因为用法不当导致的,可通过以下方法解决

          • 单实例,增加捕获异常

          • 单实例崩溃之后,使用forever或者pm2自动重启,可以继续服务

          • 单机器多实例,多核集群

          • 多台服务器做集群

          • 服务器都崩溃了和应用无关,问题是运维要集中处理的

        • 小结:nodejs本身应用并无大的问题,不同的只是其处理方式是不同的

    • 一些基本认知

      • nodejs最初的优势是异步特性带来的性能优势,所以即使不做性能优化,本身也很好,后面各个语言都推进了相关的优化。所以目前node的优势,是性能和生态(大量的开源模块)的结合。

      • 异步的基本选择:async 大于 promise 大于 callback 大于 co

      • 基本的选型:从express到koa到egg ;异步流程控制从promise 到 async ;测试从mocha到ava ;数据库MongoDB

    • 更好的实践

      • yarn的好处

        • 本地缓存的性能更好

        • 可并行的进行一些操作,加速了新模块的安装

        • 使用了lockfile,使用确定的算法创建一个跨机器的一致文件

        • 出于安全考虑,安装进程里不允许编写包的开发者执行其他代码