Поиск масштабируемой реализации "на"
Я ищу масштабируемую "на" замену с высокой доступностью. Он должен поддерживать добавление и удаление заданий во время выполнения.
Некоторые предпосылки:
У меня есть приложение, в котором я запускаю миллионы событий, каждое событие происходит только один раз. Мне не нужны cron-подобные механизмы (первое воскресенье месяца и т.д.), Просто дата, время и контекст.
В настоящее время я использую Quartz scheduler, и, хотя это очень хороший проект, у него есть трудности с обработкой количества событий, которые мы бросать на него, даже после многократной настройки (осколки, увеличение интервала опроса и т.д.) из-за основной блокировки, выполняемой в базе данных подчеркивания. Кроме того, для нас это немного утомительно, так как в основном у нас есть миллионы одноразовых триггеров и относительно небольшое количество заданий.
Буду признателен за любое предложение
Ответы
Ответ 1
Если бы я столкнулся с тем же сценарием, я бы сделал следующее...
Настройка кластера очереди JMS (например, RabbitMQ или ActiveMQ) с использованием настройки репликации очереди в нескольких блоках.
Огоньте все события в моей красивой высокодоступной очереди JMS.
Затем я бы закодировал приложение-агент, которое при необходимости вывело события очереди JMS, я мог запускать несколько агентов в нескольких ящиках и иметь это в сочетании с правильным URL-адресом восстановления JMS и т.д.
Вы также можете использовать такую же модель, если ваши задания запускают события...
Fyi, более удобный способ планирования в ядре Java выглядит следующим образом:
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount);
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//Pop events from event queue.
//Do some stuff with them.
}
}, initialDelay, period, TimeUnit.X);
Ответ 2
Возможно, просто используйте JGroups общее дерево с задачи, отсортированные по времени выполнения. В узлах будет выполняться первая задача и таймер расписания, который будет выполняться в заданное время. На задачу удалить таймер можно отменить.
Таким образом, вы можете использовать только JGroups и простые java-таймеры/исполнители.
Я не читал его целиком, но вот несколько доказательство концепции или, возможно, даже решение
Ответ 3
как насчет таймера java?
import java.util.*;
public class MyTask extends TimerTask{
public void run(){
System.out.println( "do it!" );
}
}
а затем
Timer timer = new Timer();
MyTask job1 = new MyTask();
// once after 2 seconds
timer.schedule( job1, 2000 );
job1.cancel();
MyTask job2 = new MyTask();
// nach each 5 seconds after 1 second
timer.schedule ( job2, 1000, 5000 );