Как подписаться на событие (trigger) устаревания даты и вызвать NOTIFY?

Всем привет!

Делаю транзакционную систему (платежи за магазин, услуги, переводы бонусов). Архитектура микросервисная, транзакции (платежи) распределенные. Под "транзакцией" я в этом контексте имею в виду не СУБД транзакции, а сами сделки/платежи. Фактический, конечный статус транзакции вообще в системах партнера, типа акваиринга поэтому чтобы узнать была ли транзакция успешной приходится полить системы партнера. Полить статус надо по определенному алгоритму, чем долльше транзакция в обработке тем реже ее полим. Например, первый запрос делать через 1 секунду, второй через 3, третий через 5, пятый через 15, шестой через минуту. Сейчас как раз занимаюсь поллером, задача для меня не новая, я уже делал это на прошлой работе, тогда я все сделал на уровне приложения. Грубо говоря моя прила запускалась по крону и селекотовала каждую секунду.

Сейчас мне такое решение не нравится и мне хочется вообще обойтись без селектов, хочу, чтобы БД сама сообщала о записях, по которым надо запросить статус. Что-то типа тригера на next_check_at <= NOW(), который будет вызывать NOTIFY, на который подписано мое приложение. Также хочу, чтобы по этому тригеру для каждой найденной записи инкрементировалось поле next_check_at, на след. временную метку в зависимости от текущей итерации опроса.

Гуглление привело меня к мысли, о том, что тригеров на наступление даты не бывает. Но я реально не хочу всю описанную логику реализовывать в приложении. Из более-менее интересных инструментов этой области я нагуглил pg_cron и pgpro_scheduler. Первый - непойми что за расширение и мне будет трудно протащить его у архитектора, второй же только для postgresPro.

Посоветуйте, пожалуйста, решение удовлетворяющее моим потребностям или какой-нибудь удачный компромис.

Спасибо.

UPD!

Сейчас подумал, что я могу написать функцию poll_outdated_records, которая будет селектовать по условию next_check_at <= NOW() и в случае нахождения таких записей будет делать UPDATE их поля next_check_at на следуюущую временную точку, а затем вызвать NOTIFY по этим записям. На уровне крона же я смогу просто конфигурировать как часто хочу вызывать функцию poll_outdated_records: раз в секунду, 5 секуд, минуту...

Только вот хотел бы уточнить у знатоков, насколько это нормальное решение? Насклько оптимальное?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
NeiroNx
@NeiroNx
Программист
раз в 10 минут выбирать записи с устаревшей датой и делать с ними все что нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы