7 Stimmen

Wie man die Verzögerungsaufgabe drosselt, um die Facebook-API nicht zu verärgern

Ich baue eine App, die oft auf die Facebook-Graph-API zugreifen wird. Ich habe gelernt, dass sie ein Rate-Limit von 600 Anfragen alle 600 Sekunden haben.

Ich verwende den verzögerten Job für all meine Hintergrundverarbeitung. Wie kann ich den verzögerten Job planen, um unter dem fb-API-Limit zu bleiben? Gibt es Tricks mit dem verzögerten Job, oder muss ich einen separaten Hintergrund-Task-Processor erstellen, um mein Limit nicht zu überschreiten?

Vielen Dank

0 Stimmen

Wenn eine Antwort Ihre Frage gelöst hat, denken Sie daran, sie durch Ankreuzen des Häkchens neben der Antwort zu "Akzeptieren".

0 Stimmen

"Ich baue eine App, die oft die Facebook Graph API aufrufen wird. Ich habe gelernt, dass sie ein Rate Limit von 600 Anfragen alle 600 Sekunden haben." Wo hast du diese Informationen her und wie zuverlässig sind sie? Vielen Dank, Wes"

3voto

Larry K Punkte 45322

600 Anfragen alle 600 Sekunden entspricht im Durchschnitt 1 pro Sekunde.

Nicht sehr schnell!

1) Abhängig von der Größe und dem Gewicht Ihres Unternehmens würde ich mit FB untersuchen, ob Sie das Limit für Sie erhöhen können.

2) Sie können bei DelayedJob bleiben, es ist nicht notwendig, das Rad neu zu erfinden. Sie müssen nur den Scheduler ändern.

In meiner DelayedJob-Installation verwende ich die Spalte "run_at" nicht nur, um die Zeit festzulegen, zu der die Jobs erneut ausgeführt werden sollen, sondern auch als Zeitpunkt, an dem der Job das erste Mal ausgeführt wird. Sie können es auch verwenden, um Ihre Jobs zu drosseln.

In der Datei job.rb von DelayedJob geändert:

# hinzugefügter run_at-Parameter
# z. B. Delayed::Job.enqueue NewsletterJob.new('lorem ipsum...'), 0,
# Delayed::Job.db_time_now + 15 Minuten
def self.enqueue(object, priority = 0, run_at = nil)
  unless object.respond_to?(:perform)
    raise ArgumentError, 'Kann keine Elemente in die Warteschlange einreihen, die nicht auf perform reagieren' 
  end

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

Für Ihr Ziel würde ich den letzten Zeitpunkt, an dem ein FB-API-Aufruf in die Warteschlange gestellt wurde, verfolgen und den nächsten so planen, dass die Ausführung mindestens eine Sekunde später stattfindet.

Vorteil: Sie könnten andere, nicht-FB-Aufgaben zwischen den FB-API-Aufrufen einfügen.

2voto

frommww Punkte 129

Ein bisschen Eigenwerbung, aber vielleicht möchten Sie SimpleWorker ausprobieren, eine Cloud-basierte Hintergrundverarbeitung/Warteschlange für Ruby-Apps. Sie können einen oder mehrere Jobs planen, um aus der Warteschlange genommen und die FB-API aufgerufen zu werden, wenn nötig. Die gesamte Planung und Warteschlangenverwaltung wird von SimpleWorker übernommen und die Verarbeitung erfolgt ebenfalls in der Cloud.

Es ist genau für diese Art von Nutzung konzipiert.

Sie sollten auch das mini_fb-Gem für die Arbeit mit FB überprüfen (Appoxy ist der Ersteller und Betreuer).

Lassen Sie uns wissen, wenn Sie Hilfe benötigen.

Ken @ SimpleWorker

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X