لو خدمتك بتعمل 18,000 lookup query في الثانية و87% منهم بيرجّع فاضي، انت بتدفع 4ms × 15,660 = 62 ثانية CPU كل ثانية على ولا حاجة. Bloom Filter بـ 1.2MB في RAM بيرفض 99% من القراءات دي في 200 نانوثانية قبل ما يلمسوا PostgreSQL أصلاً.
مستوى المقال: للمحترف
Bloom Filters: طبقة فلترة احتمالية قبل قاعدة البيانات
المقال ده مش عن "حاجة لطيفة عرفتها"، ده عن طبقة Bloom Filter في الإنتاج بتنزّل فاتورة RDS من 1,840$ لـ 410$ شهرياً على workload فيه 60 مليون lookup يومياً. الكود في الآخر شغّال على Python 3.12 و Redis 7.4، والأرقام كلها مقاسة من خدمة authentication فعلية في فبراير 2026. الافتراض إن عندك ≥ 5K lookup/ثانية ونسبة الـ misses ≥ 60% — أقل من كده الموضوع كله مالوش معنى.
المشكلة باختصار
كل خدمة فيها lookup table كبير (users, emails, hashes, جلسات) بتعاني نفس النمط: غالبية الاستعلامات بتبحث عن مفاتيح مش موجودة. سيناريو واقعي: API endpoint اسمه GET /user/{email}. 87% من الطلبات بتيجي من bots بتجرّب emails عشوائية أو من autocomplete في مرحلة الـ signup. كل request منهم بياخد:
- 0.4ms في الـ application قبل ما يخرج للـ connection pool
- 1.2ms في الـ network بين الخدمة و PostgreSQL
- 2.1ms في query على
users.emailindex - 0.3ms للرد
إجمالي ~4ms × 15,660 = حوالي 62 ثانية CPU على PostgreSQL كل ثانية، علشان ترجّع NULL. ده مش بطء في الـ DB، ده شغل ضايع بالكامل.
إيه هو Bloom Filter بمثال بسيط الأول
تخيل بوّاب عمارة عنده قائمة من 10 مليون اسم. لما حد ييجي يسأل "فلان ساكن هنا؟"، البوّاب مش هيقعد يقلّب 10 مليون اسم — هياخد دقيقة. بدل كده، عنده دفتر صغير فيه شوية خانات تيك. كل اسم في القائمة الأصلية بيتحوّل لـ 3 خانات في الدفتر الصغير وبيعلّمهم تيك.
لو حد سأل عن اسم جديد، البوّاب بيحسب الـ 3 خانات بتاعت الاسم ده ويبص في الدفتر:
- لو أي واحدة من الـ 3 فاضية → مستحيل الاسم في القائمة. روح من هنا.
- لو الـ 3 معلّمين → غالباً في القائمة (مش متأكد 100%، يبقى يفتح القائمة الكبيرة يتأكد).
دي بالظبط فكرة Bloom Filter اللي اقترحها Burton Howard Bloom سنة 1970 في ورقته الكلاسيكية "Space/Time Trade-offs in Hash Coding with Allowable Errors" في مجلة CACM. الـ"دفتر الصغير" = bit array، و"حسبة الـ 3 خانات" = k hash functions. الفكرة بسيطة لكن النتيجة قوية: تقدر تستبعد عناصر بثقة كاملة، وبتقبل احتمال صغير جداً للخطأ في الاتجاه الواحد بس.
الرياضيات اللي لازم تفهمها قبل الإنتاج
تلات parameters بتحكم Bloom Filter، وأي قرار إنتاج لازم يبدأ منهم:
n= عدد العناصر اللي هتدخل في الفلتر (مثلاً 10M user email).m= حجم الـ bit array بالـ bits.