如何遏制延迟工作,不愤怒的Facebook API

我正在构建一款应用程序,它将会很大程度上触及Facebook图表API。 我了解到他们每600秒有600个请求的速率限制。

我为所有后台处理使用延迟作业。 什么是安排延迟工作以保持在最低限额下的好方法? 有没有延迟工作的技巧,还是我需要建立一个单独的后台任务处理器,以便不超过我的费率限制?

谢谢


平均每600秒600个请求为每秒1个请求。

不是很快!

1)根据你公司的规模和分量,我会与FB进行调查,看看你是否能够为你提高极限。

2)你可以使用DelayedJob,不需要重新发明轮子。 你只需要改变调度器。

在我的DelayedJob安装中,我使用“run_at”列不仅仅是设置重试作业的时间 - 我还将它用作首先运行作业的时间。 你也可以用它来扼杀你的工作。

在DelayedJob文件job.rb中更改:

# added run_at param
# eg   Delayed::Job.enqueue NewsletterJob.new('lorem ipsum...'), 0,
#                           Delayed::Job.db_time_now + 15.minutes
def self.enqueue(object, priority = 0, run_at = nil)
  unless object.respond_to?(:perform)
    raise ArgumentError, 'Cannot enqueue items which do not respond to perform' 
  end

  Job.create(:payload_object => object, :priority => priority,
    :run_at => run_at)    
end                    

为了您的目标,我会跟踪FB api调用最后一次入队,并且将下一次调度run_at的时间至少缩短一秒。

好处:您可以使用FB api调用来交错其他非FB任务。


有点无耻的插件,但你可能想尝试SimpleWorker,一个基于云的后台处理/工作队列的Ruby应用程序。 您可以安排一个或多个工作从队列中卸下,并在需要时按下FB api。 所有的调度和队列管理由SimpleWorker处理,处理也在云中完成。

它是为这种使用而设计的。

建议你也检查一下与FB一起工作的mini_fb gem(Appoxy是创建者和维护者)。

如果您需要任何帮助,请告诉我们。

肯@ SimpleWorker

链接地址: http://www.djcxy.com/p/52465.html

上一篇: How to throttle Delayed job to not anger the Facebook API

下一篇: Landscape printing from HTML