在Heroku上每2分钟运行一次rake任务的最佳方法

时间:2018-09-12 22:09:37

标签: ruby-on-rails sinatra rake sidekiq

我有一个rails模块,该模块每次只能处理大约15-20个活动记录对象,而我需要每两分钟开始一次。

我试图将其卸载到sidekiq(和sidekiq-cron)上,该方法可以工作,但是由于并发性,创建了许多竞争条件和重复数据。

我真的只需要一个简单的rake任务cron来实现rails或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分钟运行一次rake任务的最佳方法是什么?

如果Sinatra可以做到,我会更喜欢,但是我找不到相同问题的解决方案。

1 个答案:

答案 0 :(得分:0)

不清楚您在问什么。您已经尝试过选项1,可以尝试选项2(创建任务并将其克隆,这非常容易),并且如果做得更好,您将比任何人都了解。

无论如何,我想如果一项任务花费2分钟以上,这两种方法都将存在并发问题。

您可以添加额外的标志,以防止两个任务处理相同的ServiceEvent(也许添加一个布尔值“ processing”,并在任务执行时将其设置为true)。

或者也许您可以拥有一个锁定文件以防止任务在另一个任务已经运行的情况下运行(您可以在任务启动时创建一个具有特定位置和名称的文件,并在完成处理后将其删除,您可以检查是否该文件存在,然后再开始新任务。)