Gitsunmin

TIL

TIL
(=Today I Learned)

1. Durable Objects의 정의 및 기본 원리

1.1 개요

Durable Objects는 Cloudflare Workers 플랫폼 위에서 동작하는 상태 유지형(Stateful) 컴퓨팅 프리미티브이다. 일반적인 서버리스 함수가 요청 후 모든 상태를 폐기하는 ‘Stateless’ 방식인 것과 달리, DO는 특정 인스턴스가 전역적으로 유일한 ID를 가지며 자신의 상태를 메모리 및 디스크에 유지할 수 있도록 설계되었다.

1.2 핵심 아키텍처 특성

  • 유일성(Uniqueness): 전 세계 어디에서 접속하든 특정 ID에 해당하는 DO 인스턴스는 단 하나만 존재한다. 이를 통해 분산 환경에서의 데이터 일치성 문제를 해결한다.
  • 단일 스레드 실행(Single-threaded Execution): 각 객체는 한 번에 하나의 이벤트(요청)만 처리한다. 이는 복잡한 동시성 제어(Locking) 없이도 데이터 정합성을 보장하는 기반이 된다.
  • 근접성(Locality): DO는 해당 객체에 대한 요청이 가장 빈번하게 발생하는 지역에 배치되어 네트워크 지연시간을 최소화한다.

2. 상태 관리 및 영속성 (Persistence)

DO의 가장 큰 특징은 데이터를 장기적으로 보존할 수 있는 능력이다.

2.1 Key-Value Storage API

기본적인 상태 저장은 this.storage.get(), put(), delete()를 통해 이루어진다. 이는 단순한 설정값이나 유저 프로필 등을 저장하는 데 적합하다.

2.2 내장 SQLite 엔진

고급 데이터 모델링을 위해 DO는 내장 SQLite를 지원한다.

  • 관계형 데이터 구조: SQL 쿼리를 통해 복잡한 데이터 관계를 정의하고 검색할 수 있다.
  • 트랜잭션 보장: 여러 작업을 하나의 단위로 묶어 처리함으로써 데이터 결손을 방지한다.
  • 고성능: 네트워크를 타지 않는 로컬 디스크 I/O 속도로 데이터베이스 작업을 수행한다.

3. 자원 최적화: 동면(Hibernation)

서버리스 환경에서 무한정 자원을 점유하는 것은 비효율적이다. DO는 이를 ‘동면’ 메커니즘으로 해결한다.

3.1 작동 메커니즘

  • 상태 전이: 일정 시간 동안 활동(요청, 알람 등)이 없으면 인스턴스는 실행 중인 메모리에서 제거된다.
  • 휘발성 주의: 동면 시 자바스크립트 변수(this.state 등)는 소멸한다. 따라서 유지해야 할 상태는 반드시 storage API를 통해 디스크에 기록해야 한다.
  • 웹소켓 동면(WebSocket Hibernation): 웹소켓 연결이 유지되는 중에도 DO가 동면할 수 있도록 지원하는 API이다. 이는 수만 개의 동시 연결을 매우 적은 비용으로 유지할 수 있게 한다.

4. 능동적 실행 트리거: 알람(Alarms)

동면 중인 객체를 스스로 깨우거나, 특정 시간에 작업을 예약하기 위해 알람 기능을 사용한다.

4.1 주요 특성

  • 정밀도: 밀리초 단위로 실행 시간을 예약할 수 있다.
  • 보장성: 인스턴스가 동면 중이거나 재시작되더라도 시스템 레벨에서 예약된 시간에 alarm() 핸들러 호출을 보장한다.
  • 멱등성: setAlarm()을 여러 번 호출하면 마지막에 설정된 시간으로 덮어써지며, 중복 실행을 방지한다.

5. 실시간 통신 및 협업 (WebSockets)

DO는 실시간 멀티플레이어 애플리케이션이나 채팅 시스템의 백엔드로 주로 활용된다.

  • 상태 공유: 여러 클라이언트가 동일한 DO 인스턴스에 웹소켓으로 연결되어 실시간으로 데이터를 교환한다.
  • 메시지 브로드캐스트: 단일 스레드 특성을 활용하여 특정 유저의 메시지를 연결된 모든 유저에게 즉각 전파할 수 있다.

6. 고급 활용 전략 및 추가 지식

6.1 배치 처리 (Batching) 전략

알람과 저장소를 결합하여 I/O 비용을 절감하는 방식이다.

  1. 클라이언트로부터 유입되는 수많은 쓰기 요청을 메모리에 임시 적재한다.
  2. setAlarm()을 통해 10초 후를 예약한다.
  3. 10초 뒤 알람이 실행되면 메모리의 모든 데이터를 SQLite에 한 번의 트랜잭션으로 일괄 기록(Bulk Insert)한다.

6.2 ID 관리 (Namespace)

  • 이름 기반 ID: idFromName(name)을 통해 특정 문자열(예: ‘room-101’)에 대응하는 고정 ID를 생성한다.
  • 무작위 ID: newUniqueId()를 통해 전역적으로 유일한 임의의 ID를 생성하여 보안성을 높인다.

6.3 제한 사항 및 고려 사항

  • CPU 타임: 각 요청당 할당된 CPU 시간이 제한되어 있으므로 무거운 연산은 지양해야 한다.
  • 메모리 한계: 인스턴스당 메모리 할당량이 정해져 있어 대용량 데이터는 SQLite나 외부 스토리지로 분산해야 한다.

7. 결론

Cloudflare Durable Objects는 동면을 통한 비용 효율성, SQLite를 통한 데이터 견고성, 알람을 통한 자동화된 스케줄링을 통합 제공하는 고도의 서버리스 솔루션이다. 분산 시스템의 복잡성을 추상화하여 개발자가 비즈니스 로직에 집중할 수 있는 환경을 제공한다.


문서 버전: 1.1 (2026-02-25)
핵심 키워드: State Management, Persistence, Hibernation, Alarms, SQLite, WebSockets