피드로 돌아가기
Honker - SQLite에 Postgres NOTIFY/LISTEN을 구현하는 확장
GeekNewsGeekNews
Database

Honker - SQLite에 Postgres NOTIFY/LISTEN을 구현하는 확장

WAL 폴링 기반 SQLite NOTIFY/LISTEN 구현으로 1ms 지연 달성

neo2026년 4월 25일7advanced

Context

SQLite는 서버리스 구조로 인해 Postgres의 NOTIFY/LISTEN과 같은 Push 기반 이벤트 전달 메커니즘이 부재함. 기존의 주기적 쿼리 방식은 오버헤드가 크며, 외부 메시지 브로커 도입 시 비즈니스 데이터와 이벤트 발행 간의 원자성(Atomicity) 결여로 인한 정합성 문제가 발생함.

Technical Solution

  • WAL 파일의 stat(2)PRAGMA data_version을 활용한 3계층 폴링 구조 설계
  • PRAGMA data_version을 통한 1ms 주기 모니터링으로 commit counter 기반의 정확한 변경 감지 구현
  • stat(2)를 100ms 주기로 실행하여 파일 교체(Atomic Rename, Volume Remount) 상황을 감지하는 이중 안전장치 마련
  • 이벤트 큐와 구독자 상태를 SQLite 내 Row로 관리하여 비즈니스 로직과 이벤트 발행을 단일 트랜잭션으로 묶는 원자적 커밋 구조 채택
  • OS별 Inotify/FSEvents의 신뢰성 문제와 크로스플랫폼 호환성을 고려하여 가장 범용적인 stat 폴링 방식을 유지하는 Trade-off 결정
  • Events INNER JOIN Subscribers 쿼리를 통한 효율적인 구독자 필터링 및 타겟 프로세스 깨우기 메커니즘 적용

단순한 시스템을 위해 무거운 브로커를 도입하기 전, DB의 WAL이나 메타데이터 변경 사항을 저비용 폴링으로 감시하여 Event-Driven 구조를 구현할 수 있는지 검토할 것. 특히 데이터 정합성이 중요하다면 이벤트 발행을 DB 트랜잭션 내에 포함시키는 설계를 최우선으로 고려해야 함.

원문 읽기