Flask, gunicorn, psycopg2 - Ошибка SSL OperationalError: сбой дешифрования или плохая запись mac - PullRequest
1 голос
/ 05 августа 2020

У меня есть Gunicorn, на котором запущены рабочие процессы syn c с ThreadedConnectionPool в качестве одноэлементного атрибута с использованием методов stati c в классе. Я выполняю некоторые фоновые задания в мастере, используя BackgroundScheduler из apscheduler. Когда задание выполняется на главном сервере, а время ожидания рабочего истекает (из-за интенсивного обращения к базе данных), я начинаю получать 500 ошибок при некоторых последующих запросах нового рабочего, которые вызывают БД с ошибкой psycopg2.OperationalError: SSL error: decryption failed or bad record Mac

Вот мой код.

class WriterDbConnectionPool:
    __pool = None

    @staticmethod
    def get_db_connection_pool():
        if not WriterDbConnectionPool.__pool:
            logger.info("WriterDbConnectionPool initialising connection pool")
            db_config = get_db_configs()
            WriterDbConnectionPool.__pool = ThreadedConnectionPool(1, 10,
                             database=xxx,
                             user=xxx,
                             password=xxx,
                             host=xxx,
                             port=xxx
                             )

        return WriterDbConnectionPool.__pool

    @staticmethod
    def close():
        if WriterDbConnectionPool.__pool:
            logger.info("WriterDbConnectionPool closing connection pool")
            WriterDbConnectionPool.__pool.closeall()
            WriterDbConnectionPool.__pool = None

Я запускаю Gunicorn со следующими параметрами

-k sync
--workers 3
--timeout 120
--bind 0.0.0.0:5000
--config gunicorn_config.py
--access-logfile -
--access-logformat
"%(p)s %(h)s %(l)s %(r)s %(s)s %(b)s %(f)s %(a)s %(L)s"
app:app

Код, который вызывает вызов DbConnectionPool, ниже

@contextmanager
def get_db_connection():
    try:
        connection = DbConnectionPool.get_db_connection_pool().getconn()
        yield connection
    finally:
        DbConnectionPool.get_db_connection_pool().putconn(connection)

Как решить эту проблему? Должен ли я использовать другой рабочий класс?

Моя версия psycopg2 - 2.7.5, flask - 0.12.2, а Gunicorn - 20.0.4

1 Ответ

0 голосов
/ 02 сентября 2020

Что я сделал, так это переместил apscheduler в отдельный процесс python и использовал BlockingScheduler для запуска моих фоновых заданий.

...