2012-04-16 5 views
12

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

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

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

Я ценю любое предложение

+0

Каковы ваши требования вокруг отказа? Например, если машина опускается, вы хотите, чтобы «пропущенные» события срабатывали при появлении замены? –

+0

Да, аналогично кварцу. Кроме того, я запускаю Quartz в кластере, поэтому всегда есть теплое ожидание машины (в Quartz все узлы конкурируют каждый раз, когда им нужно опросить БД для заданий) –

+0

Мне просто интересно, как просто мы могли бы сделать вещи * без * кварца. Однако, если каждая работа должна быть признана, это делает ее более сложной. Каков штраф, если работа выполняется дважды? (Например, вы могли бы подтвердить все задания, выполненные в последнюю минуту, раз в минуту?) –

ответ

0

Может просто использовать JGroupsshared tree с задачами, отсортированных по времени выполнения. В узлах будет выполняться первая задача и таймер расписания, который будет выполняться в заданное время. На задачу удалить таймер можно отменить. Итак, вы можете использовать только JGroups и простые таймеры/исполнители Java.

я не читал ее целиком, но вот некоторые proof of concept or maybe even solution

0

как насчет таймера 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); 
+0

1. Она не выдерживает перезагрузки процесса; 2. Как вы масштабируете его до миллионов рабочих мест? Это то, к чему стремится Кварц –

+0

1. Вы не упомянули, что настойчивость - это требование; 2. Вы сказали, что существует относительно небольшое количество рабочих мест. – kromit

+0

Извините, но я упомянул «Высокая доступность» и «Миллионы событий/Миллионы одноразовых триггеров» ... –

1

Если я сталкивался тот же сценарий, я бы сделать следующее ...

Настройка очереди кластера JMS (например, RabbitMQ или ActiveMQ) с использованием репликации очереди установите несколько ящиков.

Огонь всех событий в моей красивой высокодоступной очереди JMS.

Тогда я бы код приложения агента, который совал событие очереди JMS в случае необходимости, я мог запускать несколько агентов на нескольких коробках и что в сочетании с правильным JMS отказоустойчивого URL и т.д.

Вы также можете использовать тот же самый вид модели, если ваши рабочие места стрельбы события ...

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); 
Смежные вопросы