Size: a a a

2020 June 25

DG

Dmitry Goncharov in Go-go!
Eduard Korolev
всем привет, хочу обсудить один кейс. Есть таблица в бд с сущностями. У сущности есть дедлайн и задача сделать нотификацию с напоминанием о дедлайне. Общая схема - запускаем цикл, в котором через каждые 5 минут запрашиваем 10 сущностей, которые еще не напоминались, и отправляем это в месседжер какой нить типо кафки. Вопрос - как масштабировать такую систему? Например как следить по сколько забирать записей за раз, или с каким таймаутом, или как целостность тут поддерживать, что бы 2 инстанса не забрали одни и теже сущности, SELECT FOR UPDATE делать? но когда тогда завершать транзакцию. Делать UPDATE + RETURNING и сразу помечать нотификации как обработанные, но тогда может возникнуть проблема, что сущность отметили как напомненную, а во время отправки в месседжер паника случилась и мы нифига не отправили
побей массив сущностей на разделы по какому-нибудь постоянному признаку, например идентификатор или время создания деленный на константу. остаток от деления будет номер раздела и их обрабатывай отдельно. для примера, в простейшем случае, для 2 разделов четный - нечетный идентификатор
источник

ЛА

Локоть Анатолий... in Go-go!
Eduard Korolev
спасибо, интересный вариант, о таком ни разу не думал
Хотя вот нагуглил, что в постгресе в селекте есть опция skip locked начиная с версии 9.5
источник

SZ

Sergey Zhdanov in Go-go!
сушностям можно добавить статус?
источник

SZ

Sergey Zhdanov in Go-go!
каждый воркер берет ничейные, метит, работает, при выполнении метит как готовое. Ну и долго "работающие" разгребать как неотправленные
источник

ВГ

Владимир Гришин... in Go-go!
Eduard Korolev
всем привет, хочу обсудить один кейс. Есть таблица в бд с сущностями. У сущности есть дедлайн и задача сделать нотификацию с напоминанием о дедлайне. Общая схема - запускаем цикл, в котором через каждые 5 минут запрашиваем 10 сущностей, которые еще не напоминались, и отправляем это в месседжер какой нить типо кафки. Вопрос - как масштабировать такую систему? Например как следить по сколько забирать записей за раз, или с каким таймаутом, или как целостность тут поддерживать, что бы 2 инстанса не забрали одни и теже сущности, SELECT FOR UPDATE делать? но когда тогда завершать транзакцию. Делать UPDATE + RETURNING и сразу помечать нотификации как обработанные, но тогда может возникнуть проблема, что сущность отметили как напомненную, а во время отправки в месседжер паника случилась и мы нифига не отправили
я делаю SELECT FOR UPDATE, которая сразу выставляет новый статус типа PROCESSING, и дальше уже работаю со статусом записи в воркере
источник

ВГ

Владимир Гришин... in Go-go!
то есть транзакция забирает из очереди, выставляет новый статус, закрывает транзакцию, а потом уже работает с записью
источник

EK

Eduard Korolev in Go-go!
Владимир Гришин
я делаю SELECT FOR UPDATE, которая сразу выставляет новый статус типа PROCESSING, и дальше уже работаю со статусом записи в воркере
да можно, это как раз вариант с UPDATE+RETURNING, только мы брали те у кого pid поле null и при обработке выставляли сначала PID, а потом is_complete
источник

ВГ

Владимир Гришин... in Go-go!
Eduard Korolev
да можно, это как раз вариант с UPDATE+RETURNING, только мы брали те у кого pid поле null и при обработке выставляли сначала PID, а потом is_complete
или worker_id, кому уже что нравится
источник

EK

Eduard Korolev in Go-go!
Владимир Гришин
то есть транзакция забирает из очереди, выставляет новый статус, закрывает транзакцию, а потом уже работает с записью
спасибо
источник

ЛА

Локоть Анатолий... in Go-go!
Владимир Гришин
то есть транзакция забирает из очереди, выставляет новый статус, закрывает транзакцию, а потом уже работает с записью
Вы не делаете skip locked?
источник

ВГ

Владимир Гришин... in Go-go!
делаем
источник

ЛА

Локоть Анатолий... in Go-go!
👍
источник

ВГ

Владимир Гришин... in Go-go!
иначе бы не работало:)
источник

ВС

Владимир Столяров... in Go-go!
Владимир Гришин
я делаю SELECT FOR UPDATE, которая сразу выставляет новый статус типа PROCESSING, и дальше уже работаю со статусом записи в воркере
о оказывается я не один такой) правда такие таблицы очень любит vacuum и может не добираться до других без тюнинга
источник

ВГ

Владимир Гришин... in Go-go!
ну у нас не такие прям большие нагрузки, хотя конечно очень интересно послушать, кто на какие камни натыкался при таком подходе
источник

ВГ

Владимир Гришин... in Go-go!
мне в целом это кажется более manageable, чем очереди в каком-нить стриминге
источник

ВС

Владимир Столяров... in Go-go!
ну пока вот только это, что число мертвых строк росло до тюнинга
источник

AS

Alexander Shavelev in Go-go!
Владимир Гришин
ну у нас не такие прям большие нагрузки, хотя конечно очень интересно послушать, кто на какие камни натыкался при таком подходе
как разруливаете ситуацию, что воркер взял задачу, маркнул и приложение умерло
источник

ВГ

Владимир Гришин... in Go-go!
Alexander Shavelev
как разруливаете ситуацию, что воркер взял задачу, маркнул и приложение умерло
в нашем кейсе нормально работает клинер, который с интервалом собирает такие задачи в мертвые и направляет их на перепроцессинг/обрабатывает ошибку
источник

EK

Eugene Koshevoy in Go-go!
Alexander Shavelev
как разруливаете ситуацию, что воркер взял задачу, маркнул и приложение умерло
в таком кейсе нужно ack делать после успешного выполнения задачи. Если приложение умерло, то задача остается в очереди
источник