Perry 负责编译,Coop 负责持续运行。
区别在于语言运行时所在的位置。Coop 保持应用镜像小巧,并在主机层提供兼容的 Perry 运行时和标准库。
Perry
普通的 Perry 可执行文件
应用、运行时、垃圾回收器和选定的标准库功能会链接到一个面向目标平台的可执行文件中。
app + runtime + stdlib → executable
Coop
Coop 部署
应用被编译为仅包含应用代码的共享库。兼容的提供程序在每台机器上构建一次,并在映射应用前验证其身份。
apps → shared runtime + stdlib
按故障边界拆分
机器、每个部署和每个请求都有独立职责。应用代码绝不会在机器守护进程中运行。
01
01
守护进程 · 每台机器一个
终止 TLS,按主机和路径路由,并管理部署、制品、管理 API 和指标。
02
02
工作进程 · 每个部署一个
加载应用库,拥有 Perry 运行时状态,并执行 cron 和持久队列任务。
03
03
调用 · 每个请求一个
作为部署工作进程中的任务运行,共享其地址空间,无需为每个请求创建进程。
当前可用的能力
Coop 是经过测试的基础设施,但还不是完成的托管产品。当前实现包括:
- ✓TypeScript 编译、HTTP 路由和静态挂载
- ✓共享提供程序身份检查
- ✓内容寻址部署和回滚
- ✓Cron 和持久队列
- ✓专用工作进程的 KV 与对象存储
- ✓CLI、Prometheus 指标、告警和 Grafana 仪表板
精简的部署界面
部署是一个包含 coop.toml 和一个或多个处理程序的目录。Coop 会编译它、缓存结果并启动本地工作进程。
coop.toml
name = "hello"
version = "0.1.0"
[hosts]
domains = ["hello.test"]
[[handlers]]
file = "handlers/hello.ts"
path = "/hello"
method = "GET"handlers/hello.ts
import { CoopRequest, respond } from "@coop/runtime";
export function handle(reqJson: string): string {
const req = new CoopRequest(reqJson);
return respond(200, {}, `hello from ${req.path}`);
}本地运行
$ coop-cli dev ./hello有意保持聚焦
目前适合的场景
- ✓代码由你拥有的服务和小型应用
- ✓单个运维人员在一台机器上运行一组服务
- ✓可在 Perry TypeScript 子集中编译的工作负载
- ✓重视密度、明确制品和快速回滚的团队
Coop 尚未承诺的能力
- ·任意 npm 或 Node.js 兼容性
- ·面向不受信任第三方代码的沙箱
- ·取代 Kubernetes 或成为多区域平台
- ·相对 Node.js 的普遍性能优势