분산 스트리밍 환경의 원소 판별 트릭: 블룸 필터(Bloom Filter)와 카운트-민 스케치 확률론의 위력
대용량 유저의 이벤트 로그를 실시간으로 밀어 넣는 카프카 커슈머 파이프라인에서 "이 유저가 오늘 광고를 본 적이 있는가?"라는 단순한 중복 판별 캐시를 올리려다, 레디스 클러스터 호스트 메모리가 1테라바이트를 초과하여 파산할 뻔한 무시무시한 비용 설계 위기가 있었습니다.
정확성(100%)을 포기하는 대신 공간 복잡도 효율을 수천 배로 구원하는 차원 축소의 마법이 바로 '확률적 자료 구조(Probabilistic Data Structure)' 분야입니다. 그중 정점인 블룸 필터(Bloom Filter)는 거대한 비트(Bit) 배열 캔버스와 여러 개의 독립된 해시 함수들을 잉크 삼아 구현됩니다. 유저의 아이디가 인입될 때마다, 3~4개의 해시 암호 모듈이 그 아이디를 전혀 다른 숫자 좌표로 반환하고 해당 비트맵 보드의 전구들을 1(On)로 켭니다.
이후 방문 여부를 조회할 때는 동일한 해시 좌표의 전구들이 모두 불이 켜져 있는지 확인하면 그만입니다. 만일 단 하나라도 꺼져있다면 이 유저는 "단언컨대 100% 확률로 접근한 적이 없다"라고 오판 없이 단호히 증명할 수 있습니다. 반면 모두 불이 켜져 있다면 "아마도 방문했을 것이다"라는 근사 판정을 내리게 됩니다 (False Positive). 비록 다른 유저들의 해시가 우연히 겹쳐 거짓 양성 반응이 나올 확률이 1% 이하로 존재하지만, 1TB의 램 메모리를 낭비하는 대신 단 5MB 짜리 비트맵 공간만으로 수억 명의 일일 중복 필터링을 방어할 수 있었던 압도적 가성비는 이루 말할 수 없었습니다.
현대의 대규모 추천 시스템이나 스팸 방어 프레임워크들은 이 확률적 오차를 비즈니스 도메인 내의 허용 가능한 리스크로 흡수하며, Count-Min Sketch 등의 변형된 무기들을 탑재해 실시간 빅데이터 스트림 파이프라인의 아키텍처적 불가능성을 철저한 확률 수학의 힘으로 기만하고 있다는 것을 깊숙이 체감할 수 있었습니다.
Related Posts
JVM JIT 컴파일러의 극단적 런타임 최적화: 탈출 분석(Escape Analysis)과 스칼라 치환의 마법
정적 컴파일 언어를 압도하는 자바 머신의 동적 스크립트 프로파일링 및 객체 힙 버림 최적화 기법.
리눅스 eBPF와 XDP를 활용한 커널 바이패스(Kernel Bypass) 초저지연 패킷 필터링 아키텍처
운영체제 네트워크 스택의 병목을 우회하여 디바이스 드라이버 레벨에서 직접 샌드박스 코드를 주입하는 eBPF의 혁명.
스플릿 브레인(Split-Brain) 붕괴를 막는 분산 락(Distributed Lock) 시스템과 펜싱(Fencing) 토큰의 도입
Zookeeper, Redis Redlock의 시계 위임 맹점을 찌르는 가비지 컬렉션 시간 정지(Stop-the-World) 현상 롤백 설계.