Подтвердить что ты не робот

Поиск масштабируемой реализации "на"

Я ищу масштабируемую "на" замену с высокой доступностью. Он должен поддерживать добавление и удаление заданий во время выполнения.

Некоторые предпосылки: У меня есть приложение, в котором я запускаю миллионы событий, каждое событие происходит только один раз. Мне не нужны cron-подобные механизмы (первое воскресенье месяца и т.д.), Просто дата, время и контекст.

В настоящее время я использую Quartz scheduler, и, хотя это очень хороший проект, у него есть трудности с обработкой количества событий, которые мы бросать на него, даже после многократной настройки (осколки, увеличение интервала опроса и т.д.) из-за основной блокировки, выполняемой в базе данных подчеркивания. Кроме того, для нас это немного утомительно, так как в основном у нас есть миллионы одноразовых триггеров и относительно небольшое количество заданий.

Буду признателен за любое предложение

4b9b3361

Ответ 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 );