Class BloomFilterInitializer
java.lang.Object
it.gov.pagopa.onboarding.citizen.service.BloomFilterInitializer
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
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%)
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 Summary
ConstructorsConstructorDescriptionBloomFilterInitializer(org.redisson.api.RedissonReactiveClient redissonClient, CitizenRepository citizenRepository) -
Method Summary
Modifier and TypeMethodDescriptionvoidInitializes the Bloom Filter on application startup.voidScheduled task that resets the Bloom Filter daily at 4 AM.
-
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:
- Acquire distributed lock (prevents concurrent initialization in clustered setup)
- Check if Bloom Filter already exists in Redis
- Initialize structure if needed, then populate with fiscal codes
- 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:
- Acquire distributed lock
- Delete existing Bloom Filter from Redis
- Re-initialize with current configuration
- Re-populate with latest fiscal codes
- Release lock
-