BrokenPipeError - SQLAlchemy - Cloud SQL - Стандарт App Engine - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть приложение в App Engine Standard, которое использует базу данных Cloud SQL (postgres). Всякий раз, когда приложение go бездействует, я получаю BrokenPipeError с, но не могу понять, почему.

Я получаю следующую трассировку стека от стека-драйвера:

BrokenPipeError: [Errno 32] Broken pipe
at write (/opt/python3.7/lib/python3.7/socket.py:607)
at execute (/env/lib/python3.7/site-packages/pg8000/core.py:1908)
at execute (/env/lib/python3.7/site-packages/pg8000/core.py:860)
at do_execute (/env/lib/python3.7/site-packages/sqlalchemy/engine/default.py:588)
at _execute_context (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1246)
at reraise (/env/lib/python3.7/site-packages/sqlalchemy/util/compat.py:153)
at _handle_dbapi_exception (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1478)
at _execute_context (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1250)
at _execute_clauseelement (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1101)
at _execute_on_connection (/env/lib/python3.7/site-packages/sqlalchemy/sql/elements.py:293)
at execute (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:982)
at _execute_and_instances (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3414)
at __iter__ (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3389)
at one_or_none (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3316)
at one (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3347)
at load_on_pk_identity (/env/lib/python3.7/site-packages/sqlalchemy/orm/loading.py:284)
at _get_impl (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:1116)
at get (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:1004)
at graphql (/srv/app.py:168)
at wrapper (/env/lib/python3.7/site-packages/flask_jwt_extended/view_decorators.py:129)
at wrapped_function (/env/lib/python3.7/site-packages/flask_cors/decorator.py:128)
at dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1935)
at full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1949)
at reraise (/env/lib/python3.7/site-packages/flask/_compat.py:39)
at handle_user_exception (/env/lib/python3.7/site-packages/flask/app.py:1820)
at full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1951)
at wsgi_app (/env/lib/python3.7/site-packages/flask/app.py:2446)

Кажется, что ключевая строка: at graphql (/srv/app.py:168), которая:

user = models.User.query.get(user_uuid) # Flask-SQLAlchemy convenience method

Похоже, что мое соединение с БД устарело, поэтому оно перестает работать. Это также происходит в разных точках входа на одной и той же линии. Я предполагаю, что мой вопрос - App Engine закрывает соединения, когда он раскручивает / переводит в спящий режим экземпляры. Мне кажется, что это должно запустить их обратно при повторной инициализации, если так. Я не могу реплицировать это локально, поэтому я предполагаю, что это как-то связано с настройкой сервисов, либо наш экземпляр Cloud SQL автоматически закрывает соединения, либо App Engine делает это? Но документации по этому вопросу немного, и я не нашел никакой информации об этом. Кто-нибудь знает, что может быть причиной этого?

1 Ответ

0 голосов
/ 21 февраля 2020

Ошибки разбитого канала обычно возникают, когда предпринимаются попытки записи в сокет, полностью закрытый с другой стороны. Это может происходить, когда клиентская программа не ожидает получения всех данных с сервера и просто закрывает сокет (используя функцию close). Проблема широко рассматривается на странице документации "B.4.2.8 MySQL server has away" для MySQL.

Кроме того, я думаю, что было бы удобно просмотреть MySQL Лучшие практики уделение особого внимания правильной реализации приложения в отношении MySQL обработки соединений.

...