Шаблон проектирования для отслеживания сроков отправки напоминаний - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть требование отправлять уведомления пользователям за несколько дней до определенного срока.Моя текущая задача - использовать Cloud Scheduler для периодического вызова задания, а затем искать все подходящие записи в течение небольшого промежутка времени в функции для крайнего срока и затем оповещать их.Все работает отлично, за исключением того факта, что мне нужно создавать индекс вовремя, что не очень хорошая идея для масштабирования, так как индексирование монотонно растущих значений может создать горячую точку.Итак, каков наилучший масштабируемый выбор дизайна для этого действующего бизнес-требования?Обратите внимание, что я уже знаком с добавлением меток времени к некоторым значениям, чтобы упорядочение отслеживалось внутри раздела.Однако задание по расписанию должно определять все крайние сроки, и просто невозможно выполнить итерации каждого раздела, потому что со временем число наступающих крайних сроков может быть намного меньше, чем количество разделов.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

ИМХО, ваш конкретный контекст использования не так чувствителен к проблеме горячих точек , как вы думаете.

Эта проблема действительно применима, когда у вас очень высокая скорость чтения / записи в узкийдиапазон лексикографически близких документов - в вашем случае индекс расписания уведомлений на основе отметки времени.

Запись в индекс происходит при изменении расписаний.Как вы упомянули в комментариях, это не является большой проблемой, так как вы можете легко контролировать скорость таких обновлений.

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

Что касается чтениясторона - у вас обычно есть одна операция чтения для индекса за один раз - запрос, получающий список уведомлений для отправки за один интервал.Как только задание получает список, к индексу обычно больше нет необходимости обращаться: задание просто планирует последующие задания, отвечающие за отправку уведомлений в списке (который может получить доступ к соответствующим объектам уведомлений, но не самому индексу!).Разумеется, я предполагаю, что вы будете удобно планировать эти задания запросов друг от друга.

Даже если вы используете курсоры для учета случаев, когда количество уведомлений в списке, возвращаемых запросомбудет слишком большим, чтобы обрабатывать его за один раз (для каждого используемого курсора потребуется воссоздать исходный контекст запроса, скорее всего, снова получить доступ к индексу) - вы можете разбивать такие операции, чтобы ограничить число одновременных операций или сделать их полностью не-overlapping.См. Как удалить все записи из хранилища данных Google? для примера такого ошеломления с использованием отложенных задач GAE (аналогичный подход возможен с использованием доступных в настоящее время более общих облачных задач , которыеподдержка запланированных раз в будущем).

0 голосов
/ 28 сентября 2019

Ваш дизайн хорош.В хранилище данных (или другой системе БД) вы должны индексировать следующую дату запуска (я рекомендую в формате timestamp)

Когда ваш планировщик выполняет вашу работу (функцию, запуск в облаке или другое), он выполняет запросгде Now()> trigger timestamp.Для каждого найденного документа вы должны просто опубликовать его в PubSub (просто ID или весь документ, как вам нужно)

  • Здесь PubSub помогает избежать горячей точки и используется в качестве буфера обработки

Установите принудительную подписку на тему PubSub для обработки сообщения и эффективно отправьте уведомление.После отправки отметка времени следующего запуска обновляется в соответствии с вашим сценарием использования и спецификациями

Здесь процесс, который отправляет уведомление, может быть очень параллельным (используйте Cloud Function или Cloud Run -> Я рекомендую эту из-за параллелизмаобработка в том же экземпляре и, следовательно, самая низкая стоимость)

Будьте осторожны, ваш планировщик не должен запускать слишком часто ваш процесс.(Избегайте каждую минуту, предпочитайте каждые 10 минут или более избегать дублирования уведомлений)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...