웹 서버 정적 콘텐츠 저장소로서의 SQLite 사용
배경
- Clace는 주로 내부 도구를 위한 웹 애플리케이션을 제공하기 위해 설계된 플랫폼임.
- Clace는 웹 서버와 애플리케이션 서버가 별도로 처리하는 기능을 통합하여 제공함.
- Clace 개발 초기에는 애플리케이션 데이터와 메타데이터를 어떻게 저장할지 결정하는 것이 중요했음.
- 메타데이터는 데이터베이스에 저장하는 것이 합리적이었고, 정적 파일은 보통 파일 시스템에 저장됨.
파일 제공을 위한 SQLite 사용
- Clace는 파일 시스템 대신 SQLite를 사용하여 앱 파일을 저장하기로 결정함.
- 이는 원자적 버전 변경을 가능하게 하여, 업데이트 시 여러 파일을 한 번에 트랜잭션으로 처리할 수 있음.
- 앱 생성 및 업데이트 시 모든 파일은 SQLite 데이터베이스에 업로드되며, 개발 모드에서는 로컬 파일 시스템을 사용함.
SQLite 사용의 이점
-
트랜잭션 업데이트: 여러 파일을 한 번에 업데이트할 수 있으며, 업데이트 중 깨진 웹앱이 없도록 보장함.
-
배포 롤백: 오류 발생 시 배포를 롤백할 수 있으며, 데이터베이스 트랜잭션 롤백이 파일 시스템 정리보다 쉬움.
-
버전 간 파일 중복 제거: 동일한 파일이 여러 버전에 존재해도 파일 내용은 한 번만 저장됨.
-
앱 간 중복 제거: 여러 앱 간 동일한 파일이 존재할 때 중복을 방지함.
-
백업 용이성: SQLite를 사용하여 시스템 상태를 쉽게 백업할 수 있음.
-
콘텐츠 해싱: 파일 업로드 시 콘텐츠 SHA를 저장하여 브라우저 캐싱을 용이하게 함.
-
압축: 파일 내용은 Brotli로 압축되어 저장되며, 다양한 형식으로 쉽게 저장 가능함.
성능
- Clace의 SQLite 데이터베이스 접근 방식은 뛰어난 성능을 제공함.
- 파일 시스템을 사용하는 동등한 구현이 없어 직접적인 벤치마크 테스트는 수행되지 않았음.
- SQLite 팀의 벤치마크에 따르면, 일부 작업 부하에서 SQLite가 파일 시스템보다 더 나은 성능을 가질 수 있음.
멀티 노드 지원
- Clace는 현재 단일 노드에서 실행됨.
- 멀티 노드 지원이 추가되면, 로컬 SQLite 대신 공유 Postgres 데이터베이스를 사용할 계획임.
- 이로 인해 지연 문제가 발생할 수 있으며, 로컬 SQLite 데이터베이스를 파일 캐시로 사용하여 지연을 줄일 계획임.
이 접근 방식이 일반적이지 않은 이유
- 대부분의 웹 서버가 파일 시스템을 사용하는 이유는 편리함 때문임.
- 파일 시스템 도구를 사용하여 파일 업데이트가 가능하며, 데이터베이스를 사용하면 파일 업로드를 위한 API 인터페이스가 필요함.
GN⁺의 정리
- Clace는 내부 도구 개발 및 배포를 위한 플랫폼으로, SQLite를 사용하여 파일 저장의 이점을 극대화함.
- SQLite를 사용함으로써 트랜잭션 업데이트, 롤백, 중복 제거, 백업 용이성 등 다양한 이점을 제공함.
- 이 접근 방식은 파일 시스템의 편리함과 역사적 이유로 인해 일반적이지 않지만, SQLite의 성능과 기능을 활용하여 효율성을 높임.
- 유사한 기능을 가진 프로젝트로는 Firebase, AWS Lambda 등이 추천됨.