Async Django MQTT Client не может переподключить pg-pool через 24 часа

Позвольте мне рассказать вам о своей структуре и проблеме. У меня есть контейнеры sync и async на K8. Эти капсулы запускаются с помощью этой команды в моем docker-entrypoint.sh gunicorn myappname.wsgi:application --worker-class gevent --workers 3 --bind 0.0.0.0:8000. В асинхронных контейнерах я запускаю несколько MQTT-клиентов (paho.mqtt.client). Это мой пользовательский apps.py, который запускает клиентов асинхронно:

import asyncio
import importlib
import sys
from os import environ
from django.apps import AppConfig, apps
from django.db import connection
from .server import MQTTConsumer  # inherited from paho.mqtt.Client
from .consumers import ResponseConsumer
class CustomMqttConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'custom.mqtt'

    def ready(self):
        for _app in apps.app_configs.keys():
            topic_patterns = [
                ('$share/my-app/response', ResponseConsumer)
            ]
            
            connection.close()
            for _topic, _consumer in topic_patterns:
                asyncio.run(MQTTConsumer()(topic=_topic, consumer=_consumer))

Все работало идеально, пока не прошло 24 часа после первого init моих потребителей. После 24 часов я получаю connection closed ошибку на каждый MQTT запрос от моей БД (в данном случае pg-pool) НО когда я открываю оболочку в моем async контейнере (docker exec -it <container_id> bash) и попадаю в оболочку django (python manage.py shell) я могу использовать мои модели и фильтровать мою БД, в то время как мои потребители выбрасывают эту ошибку.

Я проверил свой pg-пул (show pool_processes) до и после перезапуска моих async-подов и увидел, что после перезагрузки все работает отлично. Новые соединения видны в pool_processes, а мои потребители продолжают получать и обрабатывать запросы mqtt без каких-либо ошибок. Я отслеживаю эти ошибки и заметил, что это происходит каждые 24 часа.

Мои асинхронные подсистемы получают 300K MQTT-сообщений почти каждую секунду. Я подумал, что могу проверить соединение с БД для каждого приходящего сообщения и переподключиться, если это необходимо, но я считаю, что это вызовет проблемы с производительностью.

Версии:

...
Django==5.0.2
paho-mqtt=2.0.0
...

Изображения:

bitnami/pgpool:latest
postgres:15

Никаких дополнительных параметров не определено ни в settings.py, ни где-либо еще.

Жду ваших комментариев или советов. Спасибо с этого момента.

Вернуться на верх