I. 基准代码( 三 )


I. 基准代码

文章插图
源文件打包工具(,-) 使用文件系统来缓存编译过的源文件 。12- 应用更倾向于在构建步骤做此动作——正如Rails资源管道,而不是在运行阶段 。
一些互联网系统依赖于 “粘性 ”,这是指将用户中的数据缓存至某进程的内存中,并将同一用户的后续请求路由到同一个进程 。粘性是 12- 极力反对的 。中的数据应该保存在诸如或Redis这样的带有过期时间的缓存中 。
VII. 端口绑定 通过端口绑定提供服务
互联网应用有时会运行于服务器的容器之中 。例如 PHP 经常作为 HTTPD的一个模块来运行,正如 Java 运行于 。
12- 应用完全自我加载而不依赖于任何网络服务器就可以创建一个面向网络的服务 。互联网应用通过端口绑定来提供服务,并监听发送至该端口的请求 。
本地环境中,开发人员通过类似:5000/的地址来访问服务 。在线上环境中,请求统一发送至公共域名而后路由至绑定了端口的网络进程 。
通常的实现思路是,将网络服务器类库通过依赖声明载入应用 。例如,的, Ruby 的Thin, Java 以及其他基于 JVM 语言的Jetty 。完全由用户端,确切的说应该是应用的代码,发起请求 。和运行环境约定好绑定的端口即可处理这些请求 。
HTTP 并不是唯一一个可以由端口绑定提供的服务 。其实几乎所有服务器软件都可以通过进程绑定端口来等待请求 。例如,使用XMPP的,以及使用Redis 协议的Redis 。
还要指出的是,端口绑定这种方式也意味着一个应用可以成为另外一个应用的后端服务,调用方将服务方提供的相应 URL 当作资源存入配置以备将来调用 。
VIII. 并发 通过进程模型进行扩展
任何计算机程序,一旦启动,就会生成一个或多个进程 。互联网应用采用多种进程运行方式 。例如,PHP 进程作为的子进程存在,随请求按需启动 。Java 进程则采取了相反的方式,在程序启动之初 JVM 就提供了一个超级进程储备了大量的系统资源(CPU 和内存),并通过多线程实现内部的并发管理 。上述 2 个例子中,进程是开发人员可以操作的最小单位 。
I. 基准代码

文章插图
在 12- 应用中,进程是一等公民 。12- 应用的进程主要借鉴于unix 守护进程模型 。开发人员可以运用这个模型去设计应用架构,将不同的工作分配给不同的进程类型 。例如,HTTP 请求可以交给 web 进程来处理,而常驻的后台工作则交由进程负责 。
这并不包括个别较为特殊的进程,例如通过虚拟机的线程处理并发的内部运算,或是使用诸如,,Node.js的异步/事件触发模型 。但一台独立的虚拟机的扩展有瓶颈(垂直扩展),所以应用程序必须可以在多台物理机器间跨进程工作 。
上述进程模型会在系统急需扩展时大放异彩 。(进程伸缩吖,需要机器的资源冗余)12- 应用的进程所具备的无共享,水平分区的特性意味着添加并发会变得简单而稳妥 。这些进程的类型以及每个类型中进程的数量就被称作进程构成 。
12- 应用的进程不需要守护进程或是写入 PID 文件 。相反的,应该借助操作系统的进程管理器(例如,分布式的进程管理云平台,或是类似的工具),来管理输出流,响应崩溃的进程,以及处理用户触发的重启和关闭超级进程的请求 。
IX. 易处理 快速启动和优雅终止可最大化健壮性
12- 应用的进程是易处理()的,意思是说它们可以瞬间开启或停止 。这有利于快速、弹性的伸缩应用,迅速部署变化的代码或配置,稳健的部署应用 。