Лучший способ запускать грабли каждые 2 минуты на Heroku - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть модуль rails, который обрабатывает некоторые активные объекты записи, только около 15-20 за раз, которые мне нужно запускать каждые две минуты.

Я попытался разгрузить его в sidekiq (иsidekiq-cron), который работает, но с параллелизмом, создал много условий гонки и дублирующих данных.

Мне просто нужен простой cron задачи рейка для рельсов или, возможно, sinatra (как я создал бы новое приложение sinatraпросто для выполнения этих задач)

  • Мне нужно либо принудительно заставить sidekiq обрабатывать в одном потоке, либо
  • иметь задачу "cron", запустить задачу rake или дажемодуль напрямую

    def self.process_events
      events = StripeEvent.where(processed: false)
      events = StripeServices.arrange_processing_order events
      events.each do |event_obj|
        StripeServices.new(event_obj).process_event_obj
      end
    end
    

спасибо за любую точку в правильном направлении.

  • отредактировано

извините, я не очень ясно,перемещение моего модуля в sidekiq вызвало проблемы с параллелизмом, к которым я не был готов (мой код не является потокобезопасным), и с учетом ограничений, которые Heroku накладывает на "crons", каков наилучший способ запускать грабли каждые 2 минуты?

Если Синатра может это сделать, я бы предпочел, но я не могу найти решение той же проблемы.

1 Ответ

0 голосов
/ 13 сентября 2018

Непонятно, о чем ты спрашиваешь. Вы уже опробовали вариант 1, вы можете попробовать вариант 2 (создайте задачу и создайте ее, это очень просто), и вы узнаете лучше, чем кто-либо, если она лучше.

В любом случае, я полагаю, что оба метода будут иметь проблемы с параллелизмом, если одна задача займет более 2 минут.

Вы можете добавить дополнительные флаги, чтобы две задачи не обрабатывали одно и то же ServiceEvent (возможно, добавьте логическую «обработку» и установите для нее значение true, когда задача ее берет).

Или, может быть, у вас может быть файл блокировки, чтобы предотвратить запуск задачи, если другая уже запущена (вы создаете файл с определенным расположением и именем при запуске задачи и удаляете его, когда она завершает обработку, вы можете проверить, если файл существует до начала новой задачи).

...