Способ обработки «убитых» заданий Java?
-
06-07-2019 - |
Вопрос
Наше серверное веб-приложение будет обрабатывать задания, запрашиваемые запросами REST API.
В идеале, если сервер умирает во время задания (т.е.:вилка выдернута), работа должна возобновиться или перезапуститься при запуске.
Очень удобный способ обработки этих заданий — в отдельном потоке с использованием некоторых параллельных служебных классов в Java 5.Единственная проблема заключается в том, что в случае сбоя вам необходимо записать сведения о задании и создать процесс, который считывает эти сведения при запуске и возобновляет задания.Кажется, это больно.
Альтернативный подход — использовать очередь, в которой пользователь делает запрос, мы записываем в очередь, затем читаем из очереди и выполняем задание и удаляем сообщение только после завершения задания.Это упрощает возобновление задания при запуске, поскольку сервер при запуске просто прочитает данные из очереди и возобновит процесс.
Есть ли лучшие подходы к этому сценарию?
Решение
Учитывая, что вы указали REST, очевидно, что у вас есть клиенты, которые отправляют запросы и требуют результатов.Почему бы не возложить бремя определения того, завершили ли они работу, на сами клиенты.
напримерклиент делает запрос.Если он получит результат, все в порядке.Однако если клиент обнаруживает, что сервер завершил работу (из-за преждевременного отключения HTTP-соединения), он может отступить и повторить попытку позже.При желании вы можете реализовать различные стратегии повторных попыток (например,повторить попытку на другом хосте, отказаться от n попыток и т. д.).
Таким образом, клиенты сохраняют знания о том, что им требуется (по-видимому, они в любом случае должны это делать), а ваши серверы не сохраняют состояние, и ими намного проще управлять.
Другие советы
Я бы использовал Кварц (который имеет функции отработки отказа) управлять своей работой. Р>
PS: Я бы предпочел ошибаться, но, прочитав ваши последние вопросы, я чувствую, что вы создаете что-то слишком сложное или концептуально неправильное. ИМХО просто слишком много архитектурных запахов.