Apache Ignite — планирование в кластере

Я думаю об этом уже неделю, но не придумал ничего, что меня убедило бы.

У меня есть небольшой кластер, на котором работает 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 и не вижу эффективной системы для управления большим количеством запланированных задач.

Признаюсь, я застрял, и мне нужен совет о том, как можно планировать события на основе кластера, будучи уверенным, что они будут вызваны, а также будут противостоять отказу узла.


person Newbie    schedule 03.01.2017    source источник


Ответы (1)


Я думаю, вы можете создать одноэлементный кластер (https://apacheignite.readme.io/docs/cluster-singletons), которые позаботятся о расписании. Это автоматически обрабатывает отказоустойчивость в случае сбоев. Если есть какое-либо состояние (например, информация об уведомленных пользователях, метка времени, когда задание было запланировано в последний раз и т. д.), его можно сохранить в кэше.

person Valentin Kulichenko    schedule 04.01.2017