블룸 필터(Bloom Filter)로 API 응답 시간 16배 단축!
대규모 데이터 필터링(Large-scale Data Filtering) 성능 개선을 위해 블룸 필터(Bloom Filter)를 도입하여 API 응답 시간을 16배 향상시킴
기존 Postgres 데이터베이스(Postgres Database)의 JSONB 필터링(JSONB Filtering) 성능 문제를 해결하기 위해 GIN 인덱스(GIN Index)와 블룸 필터(Bloom Filter)를 비교 분석
블룸 필터(Bloom Filter) 적용을 통해 5초에서 0.3초로 P95 응답 시간 단축
시간 기반 데이터 분할(Time-based Data Partitioning)을 통해 데이터 양에 따른 성능 저하 문제를 해결
블룸 필터(Bloom Filter)의 핵심 원리
블룸 필터(Bloom Filter)는 집합(Set)의 멤버십(Membership)을 효율적으로 검사하기 위한 확률적 자료구조다. 여러 개의 해시 함수(Hash Function)를 사용하여 각 항목을 비트맵(Bitmap)에 매핑하고, 비트 연산(Bitwise Operation)을 통해 해당 항목의 존재 여부를 빠르게 판단한다. 이 기술은 데이터베이스 인덱싱(Database Indexing)에 활용되어 검색 성능을 향상시키며, 특히 대량의 데이터를 처리하는 환경에서 그 효과가 두드러진다.
GIN 인덱스(GIN Index) vs 블룸 필터(Bloom Filter) 성능 비교
게시물에서는 GIN 인덱스(GIN Index)와 블룸 필터(Bloom Filter)의 성능을 비교 분석한 결과를 제시한다. GIN 인덱스는 jsonb_path_ops 연산자(Operator)를 사용하여 복잡한 데이터 타입에 대한 인덱싱을 지원하지만, 대량의 데이터가 필터링될 경우 성능 저하가 발생할 수 있다. 반면, 블룸 필터(Bloom Filter)는 비트 연산(Bitwise Operation)을 통해 빠른 검색 속도를 제공하며, 특히 빈번한 데이터 필터링(Data Filtering) 환경에서 유리하다.
시간 기반 데이터 분할(Time-based Data Partitioning)의 중요성
게시물에서는 시간 기반 데이터 분할(Time-based Data Partitioning)을 통해 데이터 양에 따른 성능 저하 문제를 해결하는 방법을 제시한다. ULID(Universally Unique Lexicographically Sortable Identifier)를 활용하여 데이터를 시간 순으로 정렬하고, 30일 단위로 데이터를 분할함으로써 검색 범위를 줄였다. 이를 통해 인덱스 스캔(Index Scan)의 효율성을 높이고, 전체적인 API 응답 시간을 단축했다.
블룸 필터(Bloom Filter) 적용의 기술적 난점
블룸 필터(Bloom Filter)는 확률적 특성(Probabilistic Nature)으로 인해, 존재하지 않는 항목이 존재한다고 잘못 판단하는 AI 환각(Hallucination), 즉, False Positive가 발생할 수 있다. 게시물에서는 이러한 문제를 해결하기 위해 비트맵(Bitmap) 크기와 해시 함수(Hash Function)의 수를 조절하여 False Positive 발생률을 최소화했다. 또한, 데이터 직렬화(Data Serialization) 및 역직렬화(Deserialization) 과정에서의 성능 최적화도 중요한 고려 사항으로 언급되었다.