
Publicado: 2026-06-14
Etiquetas: Java
Buenos días, tardes o noches:
Hace poco añadí un bloom filter a un proyecto del trabajo. Era la primera en vez mi vida que encontraba la oportunidad de usar esta estructura de datos en algo real.
Bloom filter o filtro de Bloom en castellano es una estructura de datos probabilista que permite responder a la pregunta: ¿Está el elemento x en el conjunto X?
Funciona como una tabla hash que es posiblemente la estructura de datos más conocida con la particularidad que Bloom filter ocupa muchísimo menos espacio por lo que puede manejar conjuntos más grandes. El problema es que es una estructura probabilista: a veces te dice que x está en X aunque realmente no es cierto. Si el bloom filter te dice que un algo no está es 100% correcto pero con pequeño porcentaje de error puede equivocarse y decir que sí que está. Eso reduce considerablemente el tipo de situaciones en las que se puede usar.
En muchas aplicaciones y sobre todo en servicios backend cuando algo va lento, por ejemplo una base de datos que recibe demasiadas consultas, la decisión que se suele tomar es poner una memoria cache. Con la cache solo hace falta hacer una consulta y el resultado se almacena temporalmente por si se vuelve a necesitar. Es el estándar para optimizar recursos. La gente lo aplica sin pensar en posibles alternativas.
En algunos casos el Bloom filter es una solución mejor que la cache. En aplicaciones dónde la mayor parte de las veces nos piden cosas que no tenemos, si sabemos 100% seguro que una entidad no está en la base de datos porque el filtro lo ha dicho ¿para qué hacer la consulta de primeras?
El servicio que necesitaba mejorar recibe cientos de consultas por segundos y la mayor parte de las veces no encontraba el resultado pedido. Además las entidades pedidas normalmente no se repetían.
En vez de crear una cache que guarde que un montón de entidades no existen, un Bloom filter nos permitiría saber de forma sencilla si un elemento no estaba. Parecía la aplicación obvia de esta estructura de datos.
Me hubiera gustado implementarla por mí mismo pero para ahorrar tiempo y asegurarme de que estuviera bien decidí buscar alguna librería open source que implementara Bloom filters. Parece que para java la más popular está incluída en Guava. Una librería de Google. Es la que usé y la verdad es que fue muy sencillo de añadir a nuestro proyecto.
La memoria necesaria para el bloom filter son unos pocos megabytes. El servicio sabe instantaneamente cuándo no va a encontrar el resultado y puede devolver el error directamente. Las consultas a la base de datos se han reducido en un 98%. Esto nos va a permitir reducir los recursos asignados a este servicio. En vez de 10 máquinas dedicadas a responder las peticiones seguramente podamos dejar 5.
A pesar de conocer esta estructura de datos seguramente desde hace 20 años nunca había tenido la oportunidad de usarla en un proyecto real.