У меня есть 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