Durable Actors: Cloudflare Durable Objects의 오픈소스 대안

Durable Actors는 실시간 애플리케이션을 위한 상태 유지 서버리스 함수 제공

Durable Actors는 벤더 종속성과 메모리 제한을 제거하고 내장된 관측성을 제공하는 Cloudflare Durable Objects의 오픈소스 대안입니다. 이 프레임워크는 분산 시스템에서의 지속성, 조정 및 인프라스트럭처의 복잡성을 추상화함으로써, AI 에이전트 군집, 협업 편집기(예: Notion), 채팅 시스템(예: ChatGPT)과 같은 실시간 애플리케이션을 개발할 수 있도록 기초적인 빌딩 블록을 제공합니다.

핵심 아키텍처: 지속 가능한 상태와 시리얼라이즈된 실행

프레임워크의 중심에는 "액터"라는 클래스가 있으며, 두 가지 주요 보장을 결합합니다:

  1. 지속 가능한 상태: 중단, 오류, 서버 재시작 이후에도 데이터가 유지됩니다. @Persisted 데코레이터로 표시된 필드는 런타임에 자동으로 저장됩니다.
  2. 시리얼라이즈된 실행: 동시 호출은 순차적으로 실행됩니다. 이는 여러 호출자가 액터의 상태를 안전하게 업데이트할 수 있도록 하며, 경쟁 조건이나 복잡한 잠금 메커니즘을 피할 수 있게 해줍니다.

긴 실행 시간 작업을 수행하면서 전체 액터를 차단하지 않기 위해, 프레임워크는 @Interleave 데코레이터를 제공합니다. 이는 액터가 프로미스를 기다리는 동안 다른 호출이 실행될 수 있도록 해주며, LLM 출력과 같은 스트리밍 응답에서 새 연결을 수락해야 하는 경우에 매우 중요합니다.

개발 워크플로우 및 통합

로컬 개발 및 배포

개발자는 npx durable-actors init을 사용하여 프로젝트를 초기화하고, npx durable-actors dev로 로컬 서버를 실행할 수 있습니다. 런타임은 필요 시 액터를 로드하고 상태를 자동으로 유지합니다. 프로덕션 환경에서는 Google Cloud Platform(GCP)에서 런타임을 자체 호스팅하는 것을 지원합니다.

타입 안전 클라이언트 생성

기존 백엔드에 액터를 통합하기 위해 SDK는 npx durable-actors generate를 사용해 타입 안전 클라이언트를 생성합니다. 이를 통해 백엔드(예: Express.js)는 고유한 actorId를 사용해 특정 액터로 WebSocket 연결을 준비할 수 있습니다.

언어 지원

Durable Actors SDK는 현재 TypeScript와 Python을 지원하며, 두 언어에 대한 문서와 가이드를 제공하여 액터 로직과 클라이언트 애플리케이션 사이의 일관된 계약을 보장합니다.

커뮤니티의 시각과 기술적 트레이드오프

이 프로젝트는 Cloudflare 대안으로 환영받고 있지만, Hacker News의 커뮤니티 논의에서는 가상 액터 모델을 구현하는 개발자들이 고려해야 할 몇 가지 기술적 사항이 제기되었습니다:

상태 쿼리 가능성

액터 모델의 일반적인 과제는 여러 액터에 걸친 상태 쿼리의 어려움입니다. 상태가 개별 액터 내부에 캡슐화되어 있기 때문에, 전역 쿼리를 수행하려면 상태를 별도의 쿼리 가능한 데이터베이스에 복제하거나, 상태 변경과 함께 버전화된 도메인 이벤트를 트랜잭션적으로 발행해야 합니다.

성능 및 지연 시간

일부 사용자는 쓰기 지연 시간에 대해 우려를 제기했습니다. 한 사용자는 100ms의 쓰기 시간이 고성능 애플리케이션에 제한이 될 수 있다고 지적하며, celld와 비교했는데, celld는 약 1ms 수준의 훨씬 낮은 쓰기 지연 시간을 주장하고 있습니다.

생태계 비교

커뮤니티 구성원들은 Durable Actors가 다음과 같은 다른 지속 가능한 실행 및 액터 프레임워크와 어떻게 비교되는지 묻고 있습니다:

  • 클라우드 네이티브 서비스: Azure Durable Functions, AWS Lambda Durable Functions, Durable Entities
  • 오픈소스 대안: celld, Rivet

"매우 멋지지만, 가상 액터 모델의 공통 문제 중 하나는 상태 쿼리입니다. 상태 DB가 잘 분리되어 있는 것은 좋지만, 대부분의 사용 사례에서는 다시 다른 데이터베이스에 상태를 두 번 저장해야 한다는 의미입니다."

기능 요약

기능 구현 방식
상태 지속성 @Persisted 데코레이터를 통한 필드 자동 저장
병렬 처리 제어 기본적으로 시리얼라이즈된 실행; 비동기 병렬 처리를 위해 @Interleave
클라이언트 접근 Python 및 TypeScript용 자동 생성 타입 안전 클라이언트
배포 로컬 개발 및 GCP에서의 자체 호스팅
관측성 내장된 모니터링 및 디버깅 도구

Sources

관련

  • 프로젝트
  • Dispatch
  • 프로젝트
  • Dispatch
  • Dispatch