Class BloomFilterInitializer

java.lang.Object
it.gov.pagopa.onboarding.citizen.service.BloomFilterInitializer

@Component public class BloomFilterInitializer extends Object

Initializes and manages a Redis-backed Bloom Filter for efficient citizen consent lookups.

This component provides:

  • Startup initialization: Creates and populates Bloom Filter on application start
  • Scheduled reset: Rebuilds the filter daily at 4 AM to prevent false positive rate degradation
  • Distributed locking: Ensures only one instance performs initialization/reset in clustered deployments
Bloom Filter Configuration

The filter is configured via application properties:

  • app.bloomFilter.expectedInsertions: Expected number of fiscal codes (default sizing)
  • app.bloomFilter.falseProbability: Target false positive rate (e.g., 0.01 = 1%)
Workflow
 1. Acquire distributed lock (60s timeout)
 2. Check if Bloom Filter exists in Redis
    - If exists → populate with fiscal codes
    - If not exists → initialize structure, then populate
 3. Release lock
 
Data Source Query

Uses ReactiveCrudRepository.findAll() which executes:

 db.citizen_consents.find({})
 

Filters in-memory for citizens with at least one consent where tppState = true.

See Also:
  • Constructor Details

    • BloomFilterInitializer

      public BloomFilterInitializer(org.redisson.api.RedissonReactiveClient redissonClient, CitizenRepository citizenRepository)
  • Method Details

    • initialize

      @PostConstruct public void initialize()

      Initializes the Bloom Filter on application startup.

      Workflow:

      1. Acquire distributed lock (prevents concurrent initialization in clustered setup)
      2. Check if Bloom Filter already exists in Redis
      3. Initialize structure if needed, then populate with fiscal codes
      4. Release lock

      Note: If lock cannot be acquired, initialization is skipped (another instance is handling it).

    • resetBloomFilter

      @Scheduled(cron="0 0 4 * * ?") public void resetBloomFilter()

      Scheduled task that resets the Bloom Filter daily at 4 AM.

      Purpose:

      • Prevents false positive rate degradation as new citizens are added
      • Ensures filter remains optimized for current dataset size

      Workflow:

      1. Acquire distributed lock
      2. Delete existing Bloom Filter from Redis
      3. Re-initialize with current configuration
      4. Re-populate with latest fiscal codes
      5. Release lock