Bloom Filter
ブルームフィルタ(Bloom Filter)は空間効率が非常に高い確率的データ構造で、ある要素が集合のメンバーかどうかをテストするために使用される。
Characteristics
- Space Efficient: 非常に少ないメモリを使用
- False Positive Possible: 誤検出の可能性あり(存在すると判断したが実際には存在しない)
- No False Negative: 見逃しなし(存在しないと判断した場合は確実に存在しない)
- Cannot Delete: 標準のBloom Filterは削除操作をサポートしない
Use Case: User Registration Check
以下はBloom Filterを使用してユーザー登録フローを最適化するアーキテクチャ図:
sequenceDiagram
participant C as Client
participant LB as Load Balancer /<br/>API Gateway
participant BE as Backend Server
participant RC1 as Redis Node 1<br/>(0-5460)
participant RC2 as Redis Node 2<br/>(5461-10922)
participant RC3 as Redis Node 3<br/>(10923-16383)
participant DBP as DB Primary<br/>(Write)
participant DBS as DB Secondary<br/>(Read)
C->>LB: POST /api/register
LB->>BE: ルーティング
BE->>BE: 1. Bloom Filter チェック<br/>2. CRC16(key) = hash<br/>3. slot = hash % 16384
alt Bloom Filter が True を返す
alt slot in 0-5460
BE->>RC1: ノード1を検索
else slot in 5461-10922
BE->>RC2: ノード2を検索
else slot in 10923-16383
BE->>RC3: ノード3を検索
end
alt キャッシュヒット
RC1-->>BE: Cache Hit
BE-->>C: ユーザー既存を返す
else キャッシュミス
RC1-->>BE: Cache Miss
BE->>DBS: ユーザー存在確認クエリ
DBS-->>BE: クエリ結果を返す
alt ユーザー不存在 (登録実行)
BE->>DBP: 新規ユーザーデータを書込
DBP-->>BE: 書込完了
DBP->>DBS: データ同期
BE->>RC1: 対応ノードのキャッシュを更新
BE-->>C: 登録成功
else ユーザー既存
BE->>RC1: 対応ノードのキャッシュを更新
BE-->>C: ユーザー既存を返す
end
end
else Bloom Filter が False を返す
BE-->>C: 登録可能を返す
end
How It Works
- Initialization: ビット配列を作成し、全てのビットを0に初期化
- Add Element: 複数のハッシュ関数で要素のハッシュ値を計算し、対応する位置を1に設定
- Query Element: 同じハッシュ関数でハッシュ値を計算
- 全ての対応位置が1なら、要素は**存在する可能性あり**
- いずれかの対応位置が0なら、要素は**確実に存在しない**
Applications
- Database Query Optimization: 存在しないデータのクエリを回避
- Web Crawler: URLが既にクロールされたかを判断
- Spam Filter: メールがスパムかどうかを判断
- CDN: コンテンツが既にキャッシュされているかを判断