Size: a a a

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

2020 February 25

A

Artem in Clojure — русскоговорящее сообщество
Tim Plotnikov
Да, это понятно)
Но суть вопроса в том, как понять каким юзерам отправлять уведомления?)
Я же не буду quartz джобу создавать для каждого юзера
очевидно одна на всех каждую минуту запускается например
источник

A

Alex in Clojure — русскоговорящее сообщество
Именно для каждого и будете. Это не проблема.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Alex
Именно для каждого и будете. Это не проблема.
Поясните.
У меня 1_000_000 юзеров и столько же джобов?
источник

A

Alex in Clojure — русскоговорящее сообщество
А что такое job'а? Есть либы для которых это не проблема.
источник

A

Alex in Clojure — русскоговорящее сообщество
Job это просто проверка и функция запускаемая в случае если проверка ок
источник

A

Artem in Clojure — русскоговорящее сообщество
Alex
Job это просто проверка и функция запускаемая в случае если проверка ок
это поток
источник

A

Alex in Clojure — русскоговорящее сообщество
Хотя в случае 1м сложно сказать что удобнее в БД или в памяти
источник

A

Artem in Clojure — русскоговорящее сообщество
на сколько я понимаю в рамках  кварца
источник

A

Alex in Clojure — русскоговорящее сообщество
Artem
это поток
Было бы странно. Есть пул для выполнения задач. А проверка на запуск выполняется в 1м потоке
источник

A

Alex in Clojure — русскоговорящее сообщество
Можно ещё и кластер задач поднять если это нужно.
источник

A

Artem in Clojure — русскоговорящее сообщество
вроде же при хранение в пул'е,  поток все равно потребляет ресурсы минимально это память,  1000 таких поток - должна съест какой то объем памяти
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
logo offer
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
@lisovskyvlad что насчёт такого?
источник

A

Alex in Clojure — русскоговорящее сообщество
Artem
вроде же при хранение в пул'е,  поток все равно потребляет ресурсы минимально это память,  1000 таких поток - должна съест какой то объем памяти
Не обязательно 1000 потоков, можно и меньше. Собственно такая задача в любом случае потребует паралелизма. Тем более можно использовать неблокирующие средства для ввода/вывода.
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
Sergey Trofimov
@lisovskyvlad что насчёт такого?
отлично!
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Vlad Lisovsky
отлично!
можете поменять тогда 😊
источник

A

Alex in Clojure — русскоговорящее сообщество
Artem
вроде же при хранение в пул'е,  поток все равно потребляет ресурсы минимально это память,  1000 таких поток - должна съест какой то объем памяти
Quart и любой другой планировщик, необходим в первую очередь для оповещения при срабатывании временных условий. Job'a может быть минимальной, например просто передать сообщение о том что нужно оповестить пользователя в друйго сервис или в другую часть программы которая уже сделает всю тяжелую работу сформирует оповещение и передаст его конечному пользователю.
источник

A

Alex in Clojure — русскоговорящее сообщество
И на это не нужно 1000 потоков, можно обойтись и парочкой.
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Tim Plotnikov
Народ, есть интересный вопрос.
Я делаю приложение, в котором пользователи будут получать кое-какие нотификации по расписанию. Причем каждый пользователь сам себе будет составлять расписание в формате:
{:first-hour 10
:last-hour  17
:step       1}

Что можно прочитать как: «Я хочу получать уведомления с 10:00 до 17:00 каждый 1 час».

Вопрос в следующем: как мне хранить расписания для каждого пользователя, но главное - как эффективно делать лукап по базе и выбирать тех пользователей кому нужно отправить уведомление? (вопросы часовых поясов пока не поднимаем для упрощения картины).

Первая идея была в том, чтобы на основе таких расписаний генерить группы а-ля:
{:9  [«user1», «user2» …]
:10 [«user18», «user22» ..]
…}

И потом каждый час типа «Ага, сейчас 10 часов, значит надо взять все user-id из группы 10 и отправить им уведомления.
Как быть?)
я бы на твоем месте:

1. для каждого юзера хранил конфиг расписания
2. для каждого юзера хранил время следующего срабатывания по расписанию
3. в воркере делал select * where trigger_at < now() и выполнял таски
 3.a. сюда же можешь добавить лок по row например, так что воркеры можно и параллельно выполнять без проблем

trigger_at можешь вычислять по какой угодно сложной логике и тебе не придется для этого мапить ее на sql
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
трогать кварц я бы тебе не рекомендовал. хотя бы по тому, что твоя задача решается сильно проще
источник