котором реализовал журнал состояний пользователей в виде таблицы в Posgtres.
Ситуация: при каждом сообщении программа отправляет запрос в эту базу и смотрит последнее состояние пользователя (SELECT-запрос). В зависимости от сообщения может сделать еще и инсерт новой строчки (сверху журнала добавляется запись, что в такое-то время у такого-то пользователя стало такое-то состояние), но проблема не с такими сообщениями, а с теми, что не меняют состояние.
Проблема в том, что иногда в боте может появляться вот такая ошибка:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected
[SQL:
SELECT user_state
FROM public.bot_user_states
WHERE user_id='123456' AND ts = (SELECT max(ts) FROM public.bot_user_states)
]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Вопрос: подскажите пожалуйста, что сделать с кластером, чтобы ее поправить?.. Или не изобретать колесо, и пойти делать редис?
Дополнительная информация: к таблице public.bot_user_states привязан триггер AFTER INSERT, вызывающий функцию удаления всех строк-записей после тысячной в порядке их устаревания (по колонке таймстемпа ts).
Вроде бы я делаю только селект в проблемном кейсе, а не инсерт, но мало ли, вдруг триггер все равно как-то влияет...
А в редисе, думаете, обрывы соединений будут как-то по-другому влиять, да?
Я бы сказал, что здесь сам подход неверный... Особенно радует ts = (SELECT max(ts) FROM public.bot_user_states)
А что это за ошибка на самом деле (т.е. что в логах PostgreSQL, например), Вы показывали (может, я пропустил)?
И да... При чём тут производительность?
Я предполагаю, что их не будет...
Будьте добры, выскажитесь поподробнее, в чем он неверный и как сделать верно
Не показывал У меня постгрес в яндекс облаке, а там почему-то ничего нет...
Начнем хотя бы с запроса: SELECT user_state FROM public.bot_user_states WHERE user_id='123456' AND ts = (SELECT max(ts) FROM public.bot_user_states) Как он будет себя вести, если пользователей будет более одного? Перестанет работать. Сам подход с max(ts) неверный. Я бы сделал дополнительное поле актуальности записи или использовал сортировку по убыванию ts.
То есть при обновлении журнала надо одну запись добавлять и еще одну запись редактировать в поле актуальности?
Тогда я вообще не понимаю, что мы обсуждаем (и при чём тут производительность). ;(
Мы обсуждаем, что при работе с постгресом через питоновскую библиотеку sqlalchemy происходит ошибка, которую я привел выше Как это исправить, точнее
вам нужно обратиться в техподдержку яндекс облака и задать этот вопрос им, что-то типа: «при работе с постгресом через питоновскую библиотеку sqlalchemy происходит ошибка, а на страничке логов postgres пусто»
Это не ошибка, выдаваемая PostgreSQL (и вообще, непонятно, что это за ошибка) — почему мы обсуждаем это здесь? ;)
Вполне себе с постгрес ошибка
Так покажите её, наконец! Вот это "SSL SYSCALL error: EOF detected" — явно не то, что выдаёт PostgreSQL.
Если бы я распологал такой дополнительной информацией, я бы ее дал. Но ее отсутствие, я считаю, не означает, что ошибка не связана с работой с постгрес
Да, не означает — но нам всё равно нужно увидеть что-то конкретное, чтобы что-то посоветовать. Может, Вам всё же удастся найти и посмотреть логи PostgreSQL?
Обсуждают сегодня