Мне нужна помощь в понимании пула соединений с точки зрения SQLAlchemy и с точки зрения Redshift.
В конечном итоге я хочу достичь:
- Максимизировать параллелизм запросов, но сохранить Redshift от исчерпания соединений
- Избегайте узких мест в пуле соединений, пока Redshift работает действительно хорошо, но у приложения Python недостаточно соединений, и запросы начинают формировать большую очередь
У меня есть несколько экземпляров приложения, запущенного в докереконтейнеры, каждый экземпляр создает свой собственный объект SQLAlchemy Engine с настройками пула по умолчанию.
engine = create_engine(REDSHIFT_URI, echo=True, echo_pool=True)
Я также использую модель управления контекстом, предложенную в документации SQLAlchemy, и выполняю каждый запрос в этом контексте.Все мои запросы являются запросами на агрегацию.
@contextmanager
def session_scope():
session = Session(engine)
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
Я считаю все сеансы Redshift с select count(*) from stv_sessions where user_name != ‘rdsdb’
.Количество сессий совпадает с количеством контейнеров приложений.
Затем я начинаю запускать тонны запросов из приложения. Я не вижу увеличения количества сеансов Redshift.Также я не вижу никаких сообщений от регистрации пула SQLAlchemy.
Из документации Redshift:
Каждый сеанс соответствует соединению.Вы можете просмотреть информацию об активных пользовательских сессиях для Amazon Redshift или проверить общее количество соединений с помощью STV_SESSIONS.
Насколько я понимаю, SQLAlchemy должен открыть 5 соединений, но я не вижуэто ни в Redshift, ни в журналах приложений.SQLAlchemy просто постоянно использует одно соединение?Разве определение соединения SQLAlchemy отличается от определения в Redshift?
Где поток в моей логике?Похоже, либо мое тестирование прошло плохо, либо я не понял одну из концепций.