SQLite에 Pub/Sub, 작업 큐를 더하다: Honker

by DD
1개월 전
조회수 4

Honker는 SQLite에 Postgres의 NOTIFY/LISTEN 기능을 추가하여, pub/sub, 작업 큐, 이벤트 스트림을 제공함

SQLite를 기본 데이터 저장소로 사용하는 프로젝트에서 Redis + Celery와 같은 별도 시스템 없이, 동일 파일 내에서 큐를 관리하는 방식

WAL 파일을 활용하여 폴링 없이, 단일 밀리초(millisecond) 단위의 빠른 응답 속도를 제공하며, 다양한 언어 바인딩 지원

커뮤니티에서는 동일 머신(machine) 내 IPC(Inter-Process Communication) 방식과 inotify 사용 가능성에 대한 논의가 있었음

Honker의 핵심 아키텍처: WAL 기반의 이벤트 알림

Honker는 SQLite의 WAL(Write-Ahead Logging) 파일 변경을 감지하여, 폴링(Polling) 방식 없이, cross-process 알림을 구현한다. 특히, stat(2) 시스템 콜을 사용하여 WAL 파일의 변경을 감지하며, 이를 통해 단일 밀리초(millisecond) 이내의 빠른 응답 속도를 제공한다. 이러한 아키텍처는 SQLite의 장점(Embedded, Local, Durable)을 활용하면서, 기존의 폴링 방식의 단점을 극복한다.

SQLite 확장 기능과 언어 바인딩

Honker는 SQLite 확장 기능으로 구현되어, 다양한 언어 바인딩을 지원한다. Rust, Python, Node.js, Go, Ruby, Bun, Elixir, C++ 등에서 사용할 수 있으며, 모든 바인딩은 SQLite 확장 기능을 얇게 래핑(Wrapping)한다. 이러한 구조는 SQLite 클라이언트(Client)가 동일한 테이블을 읽을 수 있도록 하여, 다양한 환경에서 Honker를 활용할 수 있게 한다.

데이터 격리 아키텍처(Data Isolation Architecture)와 트랜잭션 보장

Honker는 SQLite의 트랜잭션(Transaction) 기능을 활용하여, 데이터 일관성을 보장한다. 특히, 작업 큐(Work Queue)와 이벤트(Event)를 동일한 트랜잭션 내에서 처리함으로써, 원자성(Atomicity)을 확보한다. 예를 들어, 주문 정보 저장과 이메일 큐에 추가하는 작업을 하나의 트랜잭션으로 묶어, 롤백(Rollback) 시 두 작업 모두 롤백되도록 설계되었다.

커뮤니티 논의: IPC(Inter-Process Communication) 및 inotify

댓글에서는 동일 머신(machine) 내 프로세스 간 통신(IPC)을 통해 Honker보다 더 빠른 성능을 낼 수 있다는 의견이 제시되었다. 또한, inotify를 사용하여 WAL 변경을 감지하는 방안도 제안되었다. 하지만, ArielTM은 kqueue/FSEvents가 동일 프로세스 내 알림을 드롭(Drop)하는 문제를 지적하며, stat(2) 방식의 필요성을 강조했다.

Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite

댓글 0

첫 번째 댓글을 남겨보세요!