Я думаю об этом уже неделю, но не придумал ничего, что меня убедило бы.
У меня есть небольшой кластер, на котором работает Jetty с Jersey на всех узлах (все они идентичны). Запросы сбалансированы по узлам, и все узлы не имеют состояния.
Пользовательские данные разделены на Apache Ignite, встроенном в JVM с Jetty, и поэтому доступны для любого узла.
До сих пор все действия, выполняемые с этими данными, запускались запросами REST и управлялись узлом, на который наткнулся запрос. Но теперь требования изменились. Пример следующий:
После того как Пользователь выполняет определенное действие (предлагает виртуальный товар), несколько других случайных пользователей получают уведомление о возможности выкупить этот товар. При действии любого из них (в течение определенного времени после публикации) он будет принадлежать им. Вот проблема: если ни один пользователь не выкупит товар в течение заданного времени, я хочу выбрать несколько новых пользователей и уведомить их.
Это потребует планирования, я вижу только два решения:
Запланируйте событие на узле, которое уведомит первых нескольких пользователей. (Ненадежно, если узел выходит из строя или перезагружается)
Соберите из всех узлов распределенную коллекцию, в которой хранятся данные, необходимые для запуска событий истечения срока действия. Затем запустите те, срок действия которых истек. (Похоже, менее эффективное решение, когда эта коллекция растет)
- A hibrid of both; where events are stored in a distributed collection and scheduled may be good. If node do not fail will run and delete the collection entry. A slow iteration of the collection will check if there are events that expired and has not been deleted. (It looks a solution that may be hard to debug and predict)
Кроме того, я прочитал реализацию DelayedQueue и не вижу эффективной системы для управления большим количеством запланированных задач.
Признаюсь, я застрял, и мне нужен совет о том, как можно планировать события на основе кластера, будучи уверенным, что они будут вызваны, а также будут противостоять отказу узла.