0

Ich verwende Sinatra Gem für meine API. Was ich tun möchte, ist, wenn eine Anfrage empfangen wird, sie zu verarbeiten, die Antwort zurückzugeben und eine neue, lange laufende Aufgabe zu starten.Ruby Threading/Forking mit API (Sinatra)

Ich bin Neuling zu Ruby, ich habe über Threading gelesen, aber nicht sicher, was der beste Weg ist, um meine Aufgabe zu erfüllen.

Hier mein sinatra Endpunkt

post '/items' do 
    # Processing data 
    # Return response (body ...) 
    # Start long running task 
    end 

würde ich für jeden Rat oder Beispiel dankbar.

Antwort

2

Ich glaube, dass es besser ist, es zu tun - ist Hintergrundjobs zu verwenden. Während Ihr Worker einige lang andauernde Aufgaben ausführt, ist er für neue Anforderungen nicht verfügbar. Mit Hintergrundjobs erledigen sie die Arbeit, während Ihr Web-Mitarbeiter mit neuen Anfragen arbeiten kann.

Sie einen Blick auf beliebtesten backgroung Jobs Edelsteine ​​für Rubin als Ausgangspunkt haben: resque, delayed_jobs, sidekiq

UPD: Die Umsetzung ist abhängig vom gewählten Juwel, aber allgemeine Schema wie folgt sein:

# Controller 
post '/items' do 
    # Processing data 
    MyAwesomeJob.enqueue # here you put your job into queue 
    head :ok # or whatever 
end 

In MyAwesomejob implementieren Sie Ihre langfris runnning Aufgabe

Als nächstes über Mongoid und Hintergrundjobs. Sie sollten nie komplexe Objekte als Jobargumente verwenden. Ich weiß nicht, welche Art von Aufgabe Sie implementieren, aber es gibt eine allgemeine Antwort - verwenden Sie einfache Objekte.

Verwenden Sie beispielsweise User als Argument, verwenden Sie user_id und finden Sie es dann in Ihrem Job. Wenn Sie es so machen, können Sie jeden DB ohne Probleme verwenden.

+0

Danke für die Antwort, könnten Sie bitte ein Beispiel geben, wie es in meinem Fall aussehen würde, ich meine Antwort zurückgeben und dann Hintergrundjob hinzufügen oder umgekehrt? Danke – Putinhello

+0

Und noch etwas, ich verwende Mongoid, um Objekte zu speichern, wie kann ich es verwenden oder das Objekt an den Sidekiq übergeben? – Putinhello

+0

@Putinhello hat meine Antwort aktualisiert – unkmas

0

Stimmen Sie mit unkmas überein.

Es gibt zwei Möglichkeiten, dies zu tun. Threads oder ein Hintergrundjob Juwel wie sidekiq.

Threads sind völlig in Ordnung, wenn die Verarbeitungszeiten nicht so hoch sind und wenn Sie keinen Code für den Worker schreiben möchten. Es besteht jedoch die große Wahrscheinlichkeit, dass Sie zu viele Threads ausführen, wenn Sie keinen Threadpool verwenden oder wenn Sie mit übermäßigem HTTP-Datenverkehr rechnen.

Der beste Weg, es zu tun ist mit Sidekiq oder etwas ähnliches. Sie könnten sogar eine Jobwarteschlange wie BeanStalkd dazwischen haben und den Job in die Warteschlange stellen und die Antwort zurückgeben. Sie können veranlassen, dass ein Mitarbeiter aus der Warteschlange liest und sie später verarbeitet.