Perry 相邻项目 · Pre-1.0

让 Perry 代码安顿并运行的地方。

Coop 将一个兼容 Perry 的 TypeScript 目录编译为原生应用库并通过 HTTP 提供服务,而 Perry 运行时和标准库在每台机器上只需提供一次。

面向自有代码的实验性基础设施

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 的普遍性能优势

密度是目标,基准测试仍在推进。

当前测量在不同工作负载上呈现不同方向。Coop 在小型 Linux 应用中展现出良好密度,而另一项测试中的完整 Next.js 路由比 Node.js 使用更多 CPU。引用结果前请先阅读测试方法。

用 Perry 构建,在 Coop 中运行。

探索源码、运行示例部署,并帮助共享运行时模型发展为可靠的基础设施。