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보다 항상 빠르다는 보장