172 похожих чатов

Здравствуйте, вопрос по производительности постгреса. Контекст: пишу телеграм-бота (питон, telebot), в

котором реализовал журнал состояний пользователей в виде таблицы в 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).
Вроде бы я делаю только селект в проблемном кейсе, а не инсерт, но мало ли, вдруг триггер все равно как-то влияет...

17 ответов

26 просмотров

А в редисе, думаете, обрывы соединений будут как-то по-другому влиять, да?

Я бы сказал, что здесь сам подход неверный... Особенно радует ts = (SELECT max(ts) FROM public.bot_user_states)

А что это за ошибка на самом деле (т.е. что в логах PostgreSQL, например), Вы показывали (может, я пропустил)?

И да... При чём тут производительность?

Boris-Protoss Автор вопроса
Boris-Protoss Автор вопроса
Дмитрий Копытов
Я бы сказал, что здесь сам подход неверный... Особ...

Будьте добры, выскажитесь поподробнее, в чем он неверный и как сделать верно

Boris-Protoss Автор вопроса
Yaroslav Schekin
А что это за ошибка на самом деле (т.е. что в лога...

Не показывал У меня постгрес в яндекс облаке, а там почему-то ничего нет...

Boris Protoss
Будьте добры, выскажитесь поподробнее, в чем он не...

Начнем хотя бы с запроса: 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.

Boris-Protoss Автор вопроса
Дмитрий Копытов
Начнем хотя бы с запроса: SELECT user_state FROM p...

То есть при обновлении журнала надо одну запись добавлять и еще одну запись редактировать в поле актуальности?

Boris Protoss
screenshot Не показывал У меня постгрес в яндекс облаке, а та...

Тогда я вообще не понимаю, что мы обсуждаем (и при чём тут производительность). ;(

Boris-Protoss Автор вопроса
Yaroslav Schekin
Тогда я вообще не понимаю, что мы обсуждаем (и при...

Мы обсуждаем, что при работе с постгресом через питоновскую библиотеку sqlalchemy происходит ошибка, которую я привел выше Как это исправить, точнее

Boris Protoss
Мы обсуждаем, что при работе с постгресом через пи...

вам нужно обратиться в техподдержку яндекс облака и задать этот вопрос им, что-то типа: «при работе с постгресом через питоновскую библиотеку sqlalchemy происходит ошибка, а на страничке логов postgres пусто»

Boris Protoss
Мы обсуждаем, что при работе с постгресом через пи...

Это не ошибка, выдаваемая PostgreSQL (и вообще, непонятно, что это за ошибка) — почему мы обсуждаем это здесь? ;)

Boris-Protoss Автор вопроса

Вполне себе с постгрес ошибка

Boris Protoss
Вполне себе с постгрес ошибка

Так покажите её, наконец! Вот это "SSL SYSCALL error: EOF detected" — явно не то, что выдаёт PostgreSQL.

Boris-Protoss Автор вопроса
Yaroslav Schekin
Так покажите её, наконец! Вот это "SSL SYSCALL err...

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

Boris Protoss
Если бы я распологал такой дополнительной информац...

Да, не означает — но нам всё равно нужно увидеть что-то конкретное, чтобы что-то посоветовать. Может, Вам всё же удастся найти и посмотреть логи PostgreSQL?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта