0

私のAPIにはSinatra gemが使用されています。私がしたいのは、要求が処理され、応答を返し、新しい長期実行タスクを開始するときです。APIを使ったRubyスレッディング/フォーク

私はRubyの初心者ですが、私はスレッディングについて読んだことがありますが、自分の仕事を達成するための最良の方法は何か分かりません。

ここに私のsinatraエンドポイント

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

私が何かアドバイスや例えば感謝されます。

答えて

2

私はそれを行うより良い方法 - バックグラウンドジョブを使用することです。作業者は長時間実行されているタスクを実行している間は、新しい要求には使用できません。バックグラウンドジョブ - 彼らは仕事をしますが、あなたのWebワーカーは新しいリクエストを処理できます。あなたは出発点として、せいぜいルビーに人気のbackgroungジョブの宝石を見ることができ

resquedelayed_jobssidekiq

UPDを:インプリメンテーションは、選択された宝石に依存しますが、一般的なスキームは次のようになります。

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

MyAwesomejobでは、あなたの長期走っタスクMongoidとバックグラウンドジョブに関する

次に、実装しています。 ジョブ引数として複雑なオブジェクトを使用しないでください。どのようなタスクを実装しているのか分かりませんが、一般的な答えがあります - 単純なオブジェクトを使用します。

たとえば、Userを引数として使用する代わりに、user_idを使用して、自分の仕事の中で見つけます。このようにすれば、問題なくすべてのDBを使用できます。

+0

回答ありがとうございました。私の場合はどのように見えるかを例を挙げてお聞かせください。応答を返し、バックグラウンドジョブを追加するか、その逆の場合もありますか?ありがとう – Putinhello

+0

もう1つ、私はそれを使用するか、オブジェクトをSidekiqに渡すことができるオブジェクトを保存するためにモンゴイを使用していますか? – Putinhello

+0

@Putinhelloが私の答えを更新しました – unkmas

0

unkmasと同意します。

これを行うには2通りの方法があります。 サイドキックのようなスレッドまたはバックグラウンドジョブの宝石。

処理時間がそれほど長くなく、ワーカー用のコードを記述したくない場合は、スレッドは完全に問題ありません。しかし、スレッドプールを使用しない場合や、バースト的なhttpトラフィックが予想される場合は、スレッドが多すぎる可能性があります。

これを行う最も良い方法は、sidekiqなどを使用することです。その間にBeanstalkdのようなジョブキューを作成し、そのキューにジョブをキューイングして応答を返すこともできます。ワーカーがキューから読み込んで後で処理するようにすることができます。

関連する問題