TECH 으로 돌아가기
TECH HACKER NEWS 7분 읽기 31 READS

S3 하나로 돌아가는 에이전트 오케스트레이터, Rivet의 설계가 말하는 것

S3 하나로 돌아가는 에이전트 오케스트레이터, Rivet의 설계가 말하는 것
SOURCE IMAGE · HACKER NEWS

AI 에이전트를 실제 서비스로 운영해 본 팀이라면 비슷한 고민에 부딪힌다. 에이전트마다 세션 상태를 유지해야 하고, 실시간 연결을 다뤄야 하며, 수많은 동시 사용자를 감당하면서도 비용은 억제해야 한다. YC W23 출신 팀이 공개한 오픈소스 프로젝트 Rivet은 이 문제를 '액터 모델(actor model)'로 풀어내려는 시도다. 라이선스는 Apache 2.0이며, 백엔드용 타입드 SDK와 프런트엔드용 React 훅을 함께 제공한다.

액터 하나가 곧 하나의 에이전트

Rivet의 기본 단위는 '액터(Actor)'다. 각 액터는 키로 주소가 지정되는 장수(long-lived) 프로세스로, 인메모리 상태와 SQLite 데이터베이스, 실시간 통신을 위한 WebSocket, 그리고 스케줄링 기능을 내장한다. 에이전트 하나당, 세션 하나당, 혹은 사용자나 테넌트 단위로 액터를 하나씩 만들어 붙이는 식이다. 이 액터는 별도의 커스텀 런타임이 아니라 일반 Node.js, Bun, Rust 위에서 돌아간다. 런타임을 자체 포맷으로 감싸지 않기 때문에 기존 패키지와 도구, 테스트가 그대로 작동한다는 점을 Rivet은 강조한다.

Rivet이 내세우는 숫자는 액터당 72KB RAM과 p99 기준 4.99ms의 콜드 스타트, 그리고 수십억 단위까지의 확장성이다. 이 수치가 의미를 가지는 지점은 '샌드박스' 방식과의 비교다. 에이전트마다 VM이나 컨테이너를 띄우는 샌드박스는 기동이 느리고 대부분의 시간을 유휴 상태로 보낸다. Rivet 문서는 샌드박스가 512MiB와 1.70초를 쓰는 반면, 액터는 공유 노드 프로세스 안에서 돌아가며 유휴 시에는 휴면(hibernate) 상태로 들어간다고 설명한다. 다만 에이전트가 직접 작성한 신뢰할 수 없는 코드를 실행해야 한다면 이 구조만으로는 부족하며, 별도의 agentOS를 쓰라고 안내한다. 격리와 밀도는 서로 맞바꾸는 관계임을 분명히 한 셈이다.

데이터베이스도 메시지 버스도 없다

운영 관점에서 가장 눈에 띄는 설계는 의존성을 오브젝트 스토리지 버킷 하나로 줄였다는 점이다. 실행해야 할 데이터베이스도, 메시지 버스도 없고, 제어 평면(control plane) 인스턴스들은 버킷을 통해 서로를 발견한다. Amazon S3, Google Cloud Storage, Azure Blob Storage는 물론 MinIO, Cloudflare R2, Hetzner Object Storage 같은 S3 호환 저장소가 모두 지원되며, 한 대의 머신에서 시험해 볼 때는 로컬 파일시스템 백엔드도 쓸 수 있다. 운영팀이 관리해야 할 상태 저장 컴포넌트의 수를 극단적으로 줄이려는 의도가 읽힌다.

배포 선택지도 넓다. Rivet은 자체 클라우드 계정 안에 설치하는 BYOC를 지원해, 제어 평면과 스토리지를 사용자의 VPC 내부에서 돌리면서 운영만 Rivet이 맡는 방식이 가능하고 에어갭 환경까지 포함한다. 반대로 AWS·GCP의 전용 클러스터에서 완전 관리형으로 돌리는 Rivet Cloud도 있고, 컨테이너가 돌아가는 곳이면 어디서든 자체 호스팅할 수 있다. Docker Compose, 쿠버네티스, VM·베어메탈, Hetzner, AWS ECS, Railway, Render에 대한 가이드가 마련돼 있으며, Vitest, OpenTelemetry, Pino, AI SDK, OpenAPI, AsyncAPI 등과의 연동을 제공한다.

기존 기술과의 좌표

Rivet은 스스로를 Cloudflare Durable Objects의 자체 호스팅 가능한 오픈소스 대안으로 자주 소개된다. Durable Objects의 128MB 메모리 상한이 없고, 10GB SQLite 제한 대신 사실상 무제한 스토리지를 쓰며, 액터가 무작위로 축출되지 않고, 커스텀 런타임이 아닌 일반 Node.js·Bun 위에서 돌아 런타임을 직접 통제할 수 있다는 것이 차별점으로 제시된다. 여기에 연결 처리, 이벤트 브로드캐스트, 내구성 있는 스케줄링과 cron, Vitest 지원, 드레이닝용 라이프사이클 훅, 액터 업그레이드 제어 같은 기능이 더해진다.

학술적 계보로 보면 Rivet은 '가상 액터(virtual actor)' 패턴을 구현하며, 이는 마이크로소프트의 Orleans에 가장 가깝다. 다만 단순 JSON 저장소 대신 SQLite 영속화를 쓰고 현대적 런타임을 지원한다는 점에서 방향을 달리한다. Erlang이나 Akka는 가상 액터를 기본 제공하지 않으며, 생태계 패키지로 유사 기능을 갖추는 정도라고 Rivet은 설명한다.

실무자 입장에서 Rivet의 매력은 '운영 부담 최소화'와 '표준 런타임 유지'라는 두 축이 분명하다는 데 있다. 상태 저장 백엔드를 버킷 하나로 수렴시키고, 익숙한 Node.js 생태계를 그대로 쓰게 한 선택은 도입 장벽을 낮춘다. 동시에 한계도 솔직하게 드러나 있다. 신뢰할 수 없는 코드 실행에는 추가 격리 계층이 필요하고, 제시된 성능 수치는 벤더가 자체적으로 내세운 비교값이라는 점은 감안해야 한다. 상태 저장 에이전트를 밀도 높게 운영하려는 팀이라면, 샌드박스·Durable Objects·Orleans 계열과 나란히 놓고 검증해 볼 만한 후보다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/rivet-dev/rivet
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...