Django-redis/uWSGI- Ошибки закрытия соединения после установки таймаута в 0
Я использую Nautobot (приложение на основе Django), которое использует Redis и Celery для асинхронного выполнения задач.
Случайно при обращении к странице заданий я получаю следующую ошибку, говорящую о том, что соединение с сервером Redis было закрыто.
Изначально я использовал Redis в контейнере, а затем перешел на Google MemoryStore в рамках устранения неполадок. На обеих платформах возникла одна и та же проблема.
Я попробовал обновить конфигурацию redis на обоих, чтобы отключить таймауты:
timeout 0
А также настройка конфигурации в Django, но проблема продолжается.
# CACHE Configuration
CACHE_RETRY = Retry(ExponentialBackoff(), 3)
CACHES = {
"default": {
"BACKEND": "django_prometheus.cache.backends.redis.RedisCache",
"LOCATION": f"{os.getenv('CACHE_BROKER_URL', 'redis://127.0.0.1:6379')}/0",
"TIMEOUT": 300,
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": f"{os.getenv('CACHE_AUTH_STRING', '')}",
"SOCKET_CONNECT_TIMEOUT": 10,
"SOCKET_TIMEOUT": 0,
"CONNECTION_POOL_KWARGS": {
"ssl_cert_reqs": os.getenv('CACHE_CERT_REQUIRED', 'None'),
"retry": CACHE_RETRY,
"retry_on_timeout": True
}
},
}
}
CONTENT_TYPE_CACHE_TIMEOUT = int(os.getenv("CACHE_CONTENT_TYPE_TIMEOUT", "0"))
REDIS_LOCK_TIMEOUT = int(os.getenv("CACHE_LOCK_TIMEOUT", "0"))
CELERY_BROKER_URL = os.getenv("CACHE_BROKER_URL", "redis://127.0.0.1:6379")
CELERY_TASK_SOFT_TIME_LIMIT = int(os.getenv("CACHE_TASK_SOFT_TIME_LIMIT", str(5 * 60)))
CELERY_TASK_TIME_LIMIT = int(os.getenv("CACHE_TASK_TIME_LIMIT", str(10 * 60)))
CELERY_BROKER_TRANSPORT_OPTIONS = {
"ssl": {
"ssl_cert_reqs": os.getenv('CACHE_CERT_REQUIRED', 'None')
}
}
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = {
"ssl": {
"ssl_cert_reqs": os.getenv('CACHE_CERT_REQUIRED', 'None')
}
}
if os.getenv('CACHE_CERT_REQUIRED', 'None') == 'required':
CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS']['ssl_ca_certs'] = os.getenv('CACHE_CERT_LOCATION', '')
CELERY_BROKER_TRANSPORT_OPTIONS['ssl']['ssl_ca_certs'] = os.getenv('CACHE_CERT_LOCATION', '')
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS['ssl']['ssl_ca_certs'] = os.getenv('CACHE_CERT_LOCATION', '')
# Construct the new URL for Celery
schema, host = os.getenv("CACHE_BROKER_URL", "redis://127.0.0.1:6379").split('://')
CELERY_BROKER_URL = f"{schema}://:{os.getenv('CACHE_AUTH_STRING', '')}@{host}"
Мы не наблюдаем никаких проблем с подключением между хостами, они работали на одной машине до перехода на Memorystore.
Версии:
django-redis==5.4.0
redis==5.0.8
uwsgi==2.0.25.1-r1
Приложение запущено в k8s, и я использую Istio Service Mesh для работы в качестве "веб-сервера", в то время как uWSGI обслуживает приложение.