Первым шагом всегда является правильный анализ требований. Давайте предположим, что я менеджер проекта. Я вхожу в систему, и мой единственный проект отображается как на время . Разработчик приходит ко мне в офис и говорит, что его деятельность задерживается. Я выбираю активность разработчика и меняю ее продолжительность. Система по-прежнему отображает мой проект как по времени , поэтому я радостно ухожу с работы.
Как вы думаете, что бы я почувствовал, если бы в 3:00 я получил телефонный звонок от клиента с просьбой объяснить, почему проект больше не вовремя ? Очевидно, довольно удивлен, потому что система не предупредила меня в любом случае. Почему это случилось? Потому что мне пришлось ждать 30 секунд (а не только 1 секунду?) Для следующего запуска запланированного задания для обновления состояния проекта.
Это просто не может быть решением. Предупреждение должно быть немедленно отправлено пользователю, даже если для запуска процесса IsStale()
требуется 30 секунд. Покажите пользователю изображение loading...
или что-нибудь еще, но убедитесь, что у пользователя есть точные данные.
Теперь, что касается реализации, ничего не поделаешь, чтобы убежать от предыдущего вопроса: вам придется запускать этот процесс, когда что-то, что влияет на определенную дату выполнения, изменится. Однако то, что вы можете сделать, это не излишне запускать этот процесс. Например, вы упомянули, что можете запускать его всякий раз, когда пользователь входит в систему. Что если 2 или более пользователей входят в систему и видят один и тот же проект и ничего не меняют? Нет необходимости запускать процесс дважды.
Более того, если вы убедитесь, что процесс запущен, когда пользователь обновляет проект, вам не нужно будет запускать процесс в любое другое время. В заключение, эта схема имеет следующие преимущества и недостатки по сравнению с решением «опрос»:
Преимущества
- Нет запланированной работы
- не работает Нет ненужный процесс (это спорно, потому что вы можете установить
dirty
флаг над проектом и только запустить его, если он true
)
- Нет ненужных запросов со значением
dirty
- Пользователь всегда будет проинформирован о текущем и реальном состоянии проекта (что, безусловно, является наиболее важным элементом для решения в любом предложенном решении)
Недостатки
- Если пользователь обновляет проект, а затем обновляет его снова в течение нескольких секунд, процесс будет выполняться дважды (в схеме опроса процесс может даже не запускаться один раз за этот период, в зависимости от частоты, на которую он был запланирован) )
- Пользователь, который обновляет проект, должен будет дождаться завершения процесса
Переход к тому, как вы реализуете систему уведомлений аналогично StackOverflow, это совсем другой вопрос. Я предполагаю, что у вас есть много-много отношений с пользователями и проектами. Простейшим решением было бы добавить один атрибут к отношениям между этими объектами ( средняя таблица ):
![](https://i.stack.imgur.com/wSiLr.png)
Количество элементов: У пользователя много проектов. У проекта много пользователей
Таким образом, при запуске процесса вы должны обновить Has_pending_notifications
каждого пользователя новым результатом. Например, если пользователь обновляет проект, и он больше не по времени , вам следует установить в поле true
all users Has_pending_notifications
, чтобы они знали о ситуации. Аналогично, установите значение false
, когда проект по времени (я так понимаю, вы просто хотите, чтобы уведомления отображались, когда проект больше не по времени ).
На примере StackOverflow, когда пользователь читает уведомление, вы должны установить флаг false
. Убедитесь, что вы не используете временные метки, чтобы угадать, прочитал ли пользователь уведомление: вход в систему не означает чтение уведомлений .
Наконец, если само уведомление достаточно сложное, вы можете убрать его из отношений между пользователями и проектами и перейти к следующему:
![](https://i.stack.imgur.com/PC1d3.png)
Количество элементов: У пользователя много проектов.У проекта много пользователей.У пользователя много уведомлений.Уведомление имеет одного пользователя.Проект имеет много уведомлений.У уведомления есть один проект.
Надеюсь, что-то, что я сказал, имело смысл, или даст вам еще одну лучшую идею:)