2015-01-29 4 views
2

Мне нужно создать систему, для которой требуется не менее ста тысяч заданий, созданных/запланированных на день. Я посмотрел на несколько очередей задач, но там не так много поддержки для планирования говорят, как кварц в распределенным образом, Хорошее решение, кажется, сельдерей (я ява парень, и я не могу использовать Python),Рамка работает для очереди заданий распределенного планирования для высокого масштаба

Akka (Это похоже на хорошее решение, масштабируемое, постоянное и т. Д., Но планирование похоже ограничено, так как мне нужно запланировать 1 000 000 заданий в разное время дня в соответствии с пользовательским запросом) .new to akka, пожалуйста, поправьте меня, если я неправильно.

Мне не нужны и распределенные блокировки для планирования, а мне нужен параллелизм в асинхронном режиме. Пожалуйста, предложите альтернативы. Открыть для scala/java/javascript как язык.

Кварц не является масштабируемым (есть некоторые серьезные ограничения), я должен отправить около 300 миллионов сообщений в день, которые будут доставлены через 1.00.000 рабочих мест

+0

Как Akka ограничена именно с вашей точки зрения? Я имею в виду, вы упомянули, что *, но планирование, похоже, имеет ограничение, как мне нужно запланировать 1 000 000 заданий в разное время дня в соответствии с запросом пользователя *. Не могли бы вы рассказать об этом? – ale64bit

+0

Спасибо за ответ, извинись за ответ, я живу в другом часовом поясе. Мой req - пользователь подписывается на оповещение ежедневно, ежемесячно, ежегодно в запланированное время, даже несмотря на то, что предупреждение создается до даты, когда мне нужно запланировать задание по указанным пользователем данным вместе с предупреждением и когда просыпается работа (io/queue). Так что при использовании akka с помощью планировщика потребуется время, хотя я мог бы рассчитывать на основе подписанной даты, не уверен, что планировщик akka предназначен для этого случая использования. Пожалуйста, предложить хорошее решение – user757106

+0

Hi))) Что вас беспокоит именно о планировщике Akka? То, что точность, потому что интервалы между созданием и выполнением задания могут быть огромными? Или что-то другое? – ale64bit

ответ

1

Если вы беспокоитесь о точности планировщика Акко , как только я оказался в той же ситуации, и я скажу вам свое решение. Может быть, есть более эффективные методы для такого рода сценариев, но эта работа хорошо работала для меня. Буду признателен за любые улучшения и предложения. Вместо того, чтобы планировать работу в течение очень длительных интервалов времени, я создал роль планировщика, который отправляет тики себе, чтобы знать, когда должна выполняться работа. Предположим, вы хотите запланировать некоторую работу с даты A до настоящего времени B и выполнить ее каждые T единиц времени (от миллисекунд до нескольких лет). Тогда то, что делает мой актер, - это планирование (с использованием обычного планировщика Akka) одним тиком точно в половине интервала между текущим временем и временем, когда он должен выполнить первую работу. Это в основном как двоичный поиск. Таким образом, актер не будет постоянно гадать и будет очень точным в выполнении работы в нужное время. Смотрите код Java ниже для получения дополнительной информации:

public class WorkScheduler extends UntypedActor { 

    public static Props props(final Date from, final Date to, final long every, final TimeUnit unit) { 
     return Props.create(new Creator<WorkScheduler>() { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public WorkScheduler create() throws Exception { 
       return new WorkScheduler(from, to, every, unit); 
      } 
     }); 
    } 

    // Thresholds to avoid ticking at very long (or very short) intervals 
    private static final long MIN_TICK_DELTA = 1000 // 1 sec. 
    private static final long MAX_TICK_DELTA = 21600000 // 6 hours 

    private class Tick extends Message { 
    } 

    private long from; 
    private long to; 
    private long dt; 
    private long checkpoint; 

    public WorkScheduler(Date from, Date to, long every, TimeUnit unit) { 
     this.from = from.getTime(); 
     this.to = to.getTime(); 
     this.dt = unit.toMillis(every); 
    } 

    @Override 
    public void preStart() throws Exception { 
     scheduleNextTick(); // The first tick 
    } 

    private void scheduleNextTick() { 
     long t = new Date().getTime(); 

     // Compute next checkpoint 
     if (t < from) { 
      checkpoint = from; 
     } else { 
      long k = (t - from)/dt; 
      if ((t - from) % dt != 0) ++k; 
      checkpoint = from + k * dt; 
     } 

     if (checkpoint > to) { // All works executed. Shutdown. 
      getContext().stop(self()); 
     } else { // Schedule next tick 
      long delta = Math.max(MIN_TICK_DELTA, Math.min((checkpoint - t)/2, MAX_TICK_DELTA)); 
      getContext().system().scheduler().scheduleOnce(
        FiniteDuration.apply(delta, TimeUnit.MILLISECONDS), 
        self(), 
        new Tick(), 
        getContext().dispatcher(), 
        null); 
     } 
    } 

    @Override 
    public void onReceive(Object msg) throws Exception { 
     if (msg instanceof Tick) { 
      long t = new Date().getTime(); 
      if (t >= checkpoint) { 
       if (t >= checkpoint + dt) // Tick came too late, due to some external delay (like system restart) 
        ; 

       // execute work here, preferably spawning a new actor 
       // responsible for doing the work in asynchronous fashion 
      } 
      scheduleNextTick(); 
     } else 
      unhandled(msg); 
    } 

} 

Надеется, что это помогло))

+0

Да, это, безусловно, способ, но если запланированное время почти через месяц, я могу столкнуться с проблемами. мысли? – user757106

+0

Какие проблемы в точности? Я использовал этот код в приложениях, планирующих работу недель и месяцев спустя, и он работает правильно. Вы прочитали описание? – ale64bit

+0

Спасибо, я понял, я довольно новичок в акке, я понимаю, что каждый актер потребляет нить, а не актеров, как правило, не должно быть ни одного ядра, поэтому я один актер предназначен для тиков, разве это не тратит много времени циклы процессора? я мог бы быть совершенно неправ, не могли бы вы рассказать подробнее. – user757106

Смежные вопросы