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 하위 집합에서 컴파일되는 워크로드
  • 밀도, 명시적 아티팩트, 빠른 롤백을 중시하는 팀

아직 약속하지 않는 것

  • ·임의의 npm 또는 Node.js 호환성
  • ·신뢰할 수 없는 제3자 코드를 위한 샌드박스
  • ·Kubernetes 대체 또는 멀티 리전 플랫폼
  • ·Node.js보다 항상 빠르다는 보장

밀도가 가설이며, 벤치마크는 진행 중입니다.

현재 측정은 워크로드에 따라 서로 다른 방향을 보입니다. 작은 Linux 앱에서는 유망한 밀도를 보였지만 다른 테스트의 전체 Next.js 라우트는 Node.js보다 CPU를 더 사용했습니다. 결과를 인용하기 전에 방법론을 확인하세요.

Perry로 만들고 Coop에서 실행하세요.

소스를 살펴보고 예제 배포를 실행하며 공유 런타임 모델을 신뢰할 수 있는 인프라로 만드는 데 참여하세요.