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 ответов

13 просмотров

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

Я бы сказал, что здесь сам подход неверный... Особенно радует 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?

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

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

Типа вызывать GetParent и проверять на соответствие GetModuleHandle?
The Bird of Hermes
67
Всем привет! Кто нибудь парсил в ручную JSON без библиотек и фреймворков? Есть может ссылки на оптимальный алгоритмы работы с текстом и примеры таких парсеров?
Lem
27
Do any of you guys have interesting projects one could join? I'm a Middle Full-Stack developer (JS/TS, React & Node)
Lev Shapiro
40
Есть сайт. Там была древняя версия эво. Стоял плагин, который каждый коммент в Jot делал отдельной страницей. После обновления все слетело, теперь старница открывается отдельн...
Artem
1
$res = json_decode($наша строка из респонса); $res1 = array_map(fn($o) => $o->name, $res->breadcrumbs[0]->entities); Как такое будет на Хаскеле?.. В начале весь джейсон, в ко...
Хаскель Моисеевич Гопник
27
Добрый день. А shovel'ы можно как-то сконфигурировать в definitions.json? Пробовал что-то вроде: { "users": [ { "name": "agent", "password_hash": "RBCbTzQd...
Aleksey
1
Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
11
А чем вам питонисты не угодили?😂
.
79
В чем сила брат, в NASM или FASM?
Isaac Kleiner
18
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
Карта сайта