Size: a a a

Clojure — русскоговорящее сообщество

2020 February 25

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Tim Plotnikov
Его решение делает нежелательный сайд эффект
никаких нежелательных сайд эффектов оно не делает
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Tim Plotnikov
Реляционная алгебра здесь не при чем)
Мне нужна функция вида
getUsersToNotify(now: Date, allUsers: [User]) -> [User]
внутри делаешь select < triggered_at и получаешь. другое дело, что скорее всего тебе нужна как минимум at least once семантика хэндлинга, так что лучше выполнять нотификации в контексте выборки одного юзера
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
> другое дело, что скорее всего тебе нужна как минимум at least once семантика хэндлинга

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

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Либо я дурак, либо лыжи не едут.
Вот у меня есть расписание в формате start...end и step.
Есть функция, которая выполняется каждый час. Этой функции нужно получить всех пользователей, кому нужно отправить уведомление
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Как?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Tim Plotnikov
Либо я дурак, либо лыжи не едут.
Вот у меня есть расписание в формате start...end и step.
Есть функция, которая выполняется каждый час. Этой функции нужно получить всех пользователей, кому нужно отправить уведомление
> Вот у меня есть расписание в формате start...end и step.
это конфигурация для пользователя
при сохранении в базу для него создаётся триггер на ближайшее срабатывание
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Что такое триггер? Типа триггер в базе?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Tim Plotnikov
Что такое триггер? Типа триггер в базе?
запись вида [user, datetime, ...]
если datetime < now — пора отправлять уведомление
после отправки посмотреть на текущее расписание пользователя и сгенерировать следующий триггер
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
запись вида [user, datetime, ...]
если datetime < now — пора отправлять уведомление
после отправки посмотреть на текущее расписание пользователя и сгенерировать следующий триггер
когда юзер меняет расписание, текущий триггер удаляется и создаётся новый
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
(смайлик с пальцем вверх)
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
☝️
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
во
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
запись вида [user, datetime, ...]
если datetime < now — пора отправлять уведомление
после отправки посмотреть на текущее расписание пользователя и сгенерировать следующий триггер
@prepor ты же такое имел ввиду?
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Sergey Trofimov
запись вида [user, datetime, ...]
если datetime < now — пора отправлять уведомление
после отправки посмотреть на текущее расписание пользователя и сгенерировать следующий триггер
Так это ни чем не отличается от моего изначального варианта за исключением лишь того, что «триггер» генерится при изменении настроек, а не после отправки)
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Tim Plotnikov
Так это ни чем не отличается от моего изначального варианта за исключением лишь того, что «триггер» генерится при изменении настроек, а не после отправки)
Мы можем сгенерировать все триггеры сразу, потому что их не бесконечное кол-во)
Максимум 23 на пользователя при шаге в 1 час и в два раза больше при шаге в 30 минут)
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
ох. в твоем первоначальном варианте:

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

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Tim Plotnikov
Мы можем сгенерировать все триггеры сразу, потому что их не бесконечное кол-во)
Максимум 23 на пользователя при шаге в 1 час и в два раза больше при шаге в 30 минут)
тебе не нужно генерировать все триггеры сразу, тебе нужно сгенерировать только один
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
— следующий
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
в момент когда будешь исполнять следующий — генерируешь следующий
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
в транзакции
источник