108 lines
3.3 KiB
Python
108 lines
3.3 KiB
Python
# common/utils/cache/regions.py
|
|
import time
|
|
|
|
from dogpile.cache import make_region
|
|
from urllib.parse import urlparse
|
|
import os
|
|
|
|
|
|
def get_redis_config(app):
|
|
"""
|
|
Create Redis configuration dict based on app config
|
|
Handles both authenticated and non-authenticated setups
|
|
"""
|
|
# Parse the REDIS_BASE_URI to get all components
|
|
redis_uri = urlparse(app.config['REDIS_BASE_URI'])
|
|
|
|
config = {
|
|
'host': redis_uri.hostname,
|
|
'port': int(redis_uri.port or 6379),
|
|
'db': 0,
|
|
'redis_expiration_time': 3600,
|
|
'distributed_lock': True,
|
|
'thread_local_lock': False,
|
|
# Ingebouwde connection pooling parameters
|
|
'connection_pool_class': 'redis.BlockingConnectionPool',
|
|
'connection_pool_class_kwargs': {
|
|
'max_connections': 20,
|
|
'timeout': 20,
|
|
'retry_on_timeout': True,
|
|
'socket_connect_timeout': 5,
|
|
'socket_timeout': 5,
|
|
},
|
|
|
|
# Key prefix voor namespace isolation
|
|
'key_mangler': lambda key: f"cache:workers:{key}"
|
|
}
|
|
|
|
# Add authentication if provided
|
|
if redis_uri.username and redis_uri.password:
|
|
config.update({
|
|
'username': redis_uri.username,
|
|
'password': redis_uri.password
|
|
})
|
|
|
|
# SSL support using Dogpile's built-in mechanism
|
|
cert_data = app.config.get('REDIS_CERT_DATA')
|
|
if cert_data and redis_uri.scheme == 'rediss':
|
|
import ssl
|
|
import tempfile
|
|
|
|
# Create SSL context
|
|
ssl_context = ssl.create_default_context()
|
|
ssl_context.verify_mode = ssl.CERT_REQUIRED
|
|
ssl_context.check_hostname = True
|
|
|
|
# Write cert to temp file
|
|
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.pem') as f:
|
|
f.write(cert_data)
|
|
ssl_cert_path = f.name
|
|
|
|
ssl_context.load_verify_locations(ssl_cert_path)
|
|
|
|
# Add SSL to connection pool kwargs
|
|
config['connection_pool_class_kwargs']['ssl'] = ssl_context
|
|
|
|
return config
|
|
|
|
|
|
def create_cache_regions(app):
|
|
"""Initialize all cache regions with app config"""
|
|
redis_config = get_redis_config(app)
|
|
regions = {}
|
|
startup_time = int(time.time())
|
|
|
|
# Region for model-related caching (ModelVariables etc)
|
|
model_region = make_region(name='eveai_model').configure(
|
|
'dogpile.cache.redis',
|
|
arguments=redis_config,
|
|
replace_existing_backend=True
|
|
)
|
|
regions['eveai_model'] = model_region
|
|
|
|
# Region for eveai_chat_workers components (Specialists, Retrievers, ...)
|
|
eveai_chat_workers_region = make_region(name='eveai_chat_workers').configure(
|
|
'dogpile.cache.redis',
|
|
arguments=redis_config,
|
|
replace_existing_backend=True
|
|
)
|
|
regions['eveai_chat_workers'] = eveai_chat_workers_region
|
|
|
|
# Region for eveai_workers components (Processors, ...)
|
|
eveai_workers_region = make_region(name='eveai_workers').configure(
|
|
'dogpile.cache.redis',
|
|
arguments=redis_config, # Same config for now
|
|
replace_existing_backend=True
|
|
)
|
|
regions['eveai_workers'] = eveai_workers_region
|
|
|
|
eveai_config_region = make_region(name='eveai_config').configure(
|
|
'dogpile.cache.redis',
|
|
arguments=redis_config,
|
|
replace_existing_backend=True
|
|
)
|
|
regions['eveai_config'] = eveai_config_region
|
|
|
|
return regions
|
|
|