P-TupleSpace의 한계와 반성
-
개념: P-TupleSpace는 Ruby용 Rinda 라이브러리를 기반으로 한 영속성 튜플 스페이스로, RubyKaigi 2007에서 발표되었으며
more_rinda패키지에 포함되어 있습니다. -
동시성 처리의 제약: P-TupleSpace는 튜플 스페이스 내부에 있는 튜플만 재현 가능하며,
take작업으로 외부로 이동한 튜플은 복원할 수 없습니다. 특히take도중 크래시 발생 시 데이터 손실 가능성이 있으며, 클라이언트 입장에서는 삭제 전후를 알 수 없어 재시도 판단이 어렵습니다. 이는 병렬 처리의 협조 언어로서의 활용성을 저해하는 주요 원인이 됩니다. -
스토리지로서의 부적합성: 키-값 스토어(Hash)로 사용하라는 제안이 많았으나, 튜플 스페이스는 ‘백(bag)’ 구조로 중복을 허용하므로 해시와 같이 사용하기 어렵습니다. 해시를 모방하려면 전역 록(global lock)이 필요하여 비효율적이며, ‘백’ 형태의 스토리지 수요가 크지 않다는 점도 한계로 지적되었습니다.
스트림 지향 스토리지 Drip 소개
-
개념: Drip은 ‘멋진 로그(cool logs)’ 또는 스트림 지향 스토리지로 정의되며, 오직 추가(append)만 가능하고 수정이나 삭제는 불가능합니다. 새로운 로그가 기록될 때까지 대기할 수 있으며, 저렴하고 친화적인 브라우징 API를 제공합니다.
-
목표: P-TupleSpace의 대안으로, 실패해도 ‘어떻게든 다시 시도할 수 있는’ 협조 메커니즘과 이력 관리 해시처럼 사용할 수 있는 스토리지를 제공하는 것을 목표로 합니다.
- 큐(Queue)와의 비교:
- 큐: 객체가 이동하며 한 번 소비되면 사라집니다.
- Drip: 데이터가 쌓이는 것은 동일하나, 읽을 때 복사본(clone)을 제공하며, 요소가 사라지지 않아 여러 번, 여러 리더가 읽을 수 있습니다. 리더는 ‘관심 지점’ 또는 ‘가상 커서’를 이동하며 데이터를 읽습니다.
-
주요 API:
write(객체 기록, 태그 지정 가능),read(키를 지정하여 새로운 요소 N개 요청, 블록/타임아웃 가능),head(최신 N개 요소 요청, 태그 지정 가능),read_tag(태그를 지정하여 요소 요청, 블록 가능). - 해시(Hash)와의 비교:
- 해시처럼 사용: 태그를 키로 활용하여
write로 값을 설정하고head또는read_tag로 최신 값을 조회하거나 이력을 브라우징할 수 있습니다. - 차이점: 요소 삭제가 불가능하며, 모든 변경 이력이 남습니다. 대규모 데이터셋에서 성능 문제로
keys나each와 같은 메서드는 의도적으로 제공하지 않습니다.
- 해시처럼 사용: 태그를 키로 활용하여
-
P-TupleSpace와의 차이점: Drip은 튜플 스페이스의 개념을 인터페이스에서 과감히 제거하고, 영속성과 크래시 복구를 전제로 협조 메커니즘을 재설계한 결과물입니다.
- 활용 예시: 특정 지역의 전력 소비량 모니터링 시스템에서 Drip을 활용합니다. 센서에서 수집된 순간 데이터를 주기적으로 Drip에 기록하고, 웹 기반 리포팅 프로그램은 Drip에서 최신 20개의 데이터를 가져와 그래프를 그리는 방식으로 동작합니다.