Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby on Rails の Sidekiq を使用してバックグラウンド処理をマスターする

Sidekiq を使用すると、Ruby 開発者は時間のかかるタスクをバックグラウンドに移動することで、高速で応答性の高い Web アプリケーションを維持できます。

Sidekiq はマルチスレッドを核としており、一度に多くのジョブを処理できます。このため、Sidekiq は、重い負荷を処理したり、電子メールの送信やファイルの処理などのタスクを実行したりする Ruby または Rails アプリケーションの重要な部分になっています。バックグラウンド処理がないと、長時間実行されるタスクによってアプリケーションのメインスレッドがブロックされ、応答時間が遅くなり、ユーザー エクスペリエンスが低下します。

この投稿では、Sidekiq を効果的に利用してバックグラウンド ジョブを管理および処理することに焦点を当てます。

始めましょう!

Sidekiq の基本

基本的に、Sidekiq は、Ruby 用のフル機能のバックグラウンド処理フレームワークです。これを使用すると、応答性が高く信頼性の高い Web アプリケーションに不可欠なバックグラウンド タスクを同時に実行できます。電子メールの送信、画像のサイズ変更、CSV ファイルの処理など、時間のかかるタスクは Sidekiq を使用してバックグラウンドで実行できます。

Sidekiq のアーキテクチャは、マルチスレッドと「ワーカー」の概念に大きく依存しています。ただし、Sidekiq 6.3.0 では、Sidekiq::Worker モジュールは非推奨になり、Sidekiq::Job が優先されます。 「ワーカー」という用語は混乱を招く可能性があるため、

プロセスのことを言っているのでしょうか?スレッド?仕事の種類?開発者には、ワーカーという用語の使用をやめることをお勧めします。

ここでは、超高速のメモリ内データベースである Redis が重要な役割を果たし、これらのバックグラウンド ジョブを保存するキュー システムとして機能します。

注: Sidekiq はストレージとして Redis に依存していますが、この記事では Redis の構成と使用方法の詳細については説明しません

Sidekiq for Rails のインストールとセットアップ

まず、Ruby バージョン 2.5 以降と Redis サーバー バージョン 4 以降を実行する必要があります。

これで、Sidekiq Ruby gem をインストールする準備が整いました。

まず、Sidekiq をアプリケーションの Gemfile に追加します。

 

次に、プロジェクトのディレクトリにインストールします。

 

Sidekiq がインストールされたので、それを構成する必要があります。 Railsapplication では、Sidekiq を ActiveJob として構成します。 アダプター.config/application.rb を開きます そして、applicationclass 定義内に次の行を追加します。

 

たとえば、Redis インスタンスを指すように Sidekiq イニシャライザを作成することで、Sidekiq をさらに構成できます。これは、アプリケーションの起動時に実行される Rails の特別なスクリプトです。

config/initializers で 、sidekiq.rb という名前のファイルを作成します。 。このファイル内で、さまざまな Sidekiq 構成を指定できます。例:

 

この構成は、Sidekiq にローカル Redis サーバーに接続するように指示します。もちろん、本番環境では、ローカル URL を実際の Redis サーバーの URL に置き換えます (これは環境変数に最適な場所です)。

それで終わりです! Sidekiq をインストールして構成したら、Rails アプリケーションのバックグラウンドでジョブの作成と処理を開始する準備が整いました。

Sidekiq ジョブのセットアップ

基本的な Sidekiq ジョブをセットアップして初期化する方法は次のとおりです。

 

実際にジョブをキューに入れて実行するには、perform_async を呼び出します。 次のようなジョブ クラスのメソッド:

 

この行は、ジョブが使用可能になるとすぐに実行されるデフォルトのキューにジョブを追加します。引数「some_name」と 42 は、perform メソッド SomeNameForAJob に渡されます。

ここから、Sidekiq クライアントはジョブを Redis のキューにプッシュし、Sidekiq サーバーは処理の準備ができたらそのジョブをキューから取り出します。

最初の Sidekiq ジョブの作成

Sidekiq では、ジョブはジョブ クラスで表され、ジョブが実行する必要があるタスクは perform で定義されます。 方法。基本的な Sidekiq ジョブを作成しましょう:

 

このコード スニペットでは、クラス HelloNameJob を作成しました。 。これは 2 つの引数を取ります:nametimes 。実行すると、指定された回数だけコンソールにグリーティングが出力されます。もちろん、これは単純な例です。実際のアプリケーションでは、perform メソッドには、バックグラウンドで実行する任意のコードを含めることができます。

ジョブを実行してください。 perform_async を呼び出すだけです。 クラスのメソッドを使用し、任意の引数を perform に渡します。 メソッドは期待しています。 HelloNameJob をスケジュールする方法は次のとおりです。 作成したばかりです:

 

これにより、「Hello, Jeff!」を印刷するジョブがキューに追加されます。 5 回。

特定の時間にジョブを実行する必要がある場合は、perform_in を使用できます。 または perform_at メソッド。例:

 

これらの例では、「メレディス」は 5 分間に 3 回挨拶を受け取りますが、「ジェフ」は挨拶を 2 回受け取るまでに 2 日待つ必要があります。

Sidekiq の高度な使用法

Sidekiq は、作業をバックグラウンドにオフロードすることに限定されません。また、ジョブの再試行やジョブの優先順位付けなど、ジョブを設定できる高度な機能も提供します。

ジョブの自動再試行

Sidekiq の最も強力な機能の 1 つは、ジョブの自動再試行です。デフォルトでは、未処理の例外が原因でジョブが失敗した場合、Sidekiq は指数バックオフを使用してジョブを再試行します。 sidekiq_options を指定すると、再試行回数をカスタマイズできます。 クラスでは次のようにします:

 

この例では、ジョブが失敗した場合、Sidekiq はジョブを放棄する前に 10 回再試行します。

ジョブの優先順位付け

ジョブの優先順位付けは、Sidekiq が提供するもう 1 つの高度な機能です。ジョブを異なるキューに割り当て、各キューの優先順位を設定することで、ジョブの優先順位を制御できます。ジョブを定義するときにキューを指定する方法は次のとおりです。

 

この例では、ThisJob のジョブ クリティカルキューに入れられます。 Sidekiq サーバーを起動するときに、キューを処理する順序を指定できます。

これらは、Sidekiq の高度な機能を利用してバックグラウンド ジョブ処理を微調整する方法のほんの一例です。 Sidekiq を使用すると、アプリケーションのニーズに最適な方法でジョブを効率的かつ確実に処理するためのツールが得られます。

Sidekiq を使用したモニタリングとスケーリング

Sidekiq には、ジョブ処理能力を監視および拡張するための標準機能が付属しています。 Web ベースのダッシュボードでは、ジョブ キューをリアルタイムで表示できます。処理されたジョブと失敗したジョブの数、および現在のジョブとスケジュールされたジョブに関する詳細情報を確認できます。

Sidekiq ダッシュボードを使用するには、Rails ルート ファイルにマウントします。 config/routes.rb で 、

を追加します。
 

これらの行を追加した後、サーバー上の「/sidekiq」に移動してダッシュボードにアクセスできます。

AppSignal を使用した Sidekiq の監視

より包括的な監視を行うために、Sidekiq は AppSignal などのアプリケーションパフォーマンス監視ツールと適切に統合します。 AppSignal の Sidekiq ダッシュボードは、失敗したジョブや再試行されたジョブ、ジョブ期間、Redis メモリ使用量など、Sidekiq ジョブに関する詳細な分析情報を提供します。

Ruby on Rails の Sidekiq を使用してバックグラウンド処理をマスターする

この種の情報は、アプリケーションを拡張するときにボトルネックを特定するのに非常に貴重です。さらに、AppSignal のアラートは、キューの長さなどの異常を常に把握するのに役立ち、キューがいつ増加したかを知ることができます。

Ruby on Rails の Sidekiq を使用してバックグラウンド処理をマスターする

AppSignal を Rails を使用した Sidekiqsetup に統合するのは簡単です。 AppSignal の Ruby gem は、追加の構成を行わずに、Sidekiq サーバー ミドルウェアに挿入されます。これは ActiveJob でも動作します!

ドキュメントに記載されているセットアップを使用すれば、Rails 上で実行されない Sidekiq アプリケーションに対して AppSignal を使用することもできます。

Sidekiq の使用例

Sidekiq の最も一般的な使用例の 2 つは、非同期メール送信とスケジュールされたレポート生成です。これらの例の 1 つを詳しく見てみましょう。

電子メール、特に大容量の添付ファイルや多数の受信者が含まれる電子メールの送信には、かなりの時間がかかることがあります。バックグラウンド ジョブで電子メールの送信を処理することにより、アプリケーションは電子メールの処理中もユーザーリクエストに応答し続けることができます。

Rails アプリケーションで電子メールを送信するための Sidekiq ジョブの簡単な例を次に示します。

 

この例では、ResetPasswordJob UserMailer を使用します class を使用してパスワード リセット電子メールをユーザーに送信します。送信する電子メールをキューに入れるには、ResetPasswordJob.perform_async(user_id) を呼び出します。 アプリケーション内の他の場所から。

ただし、一般的な Rails アプリケーションでは、多くの場合、電子メールを送信するために別のSidekiq ジョブを作成する必要はありません。 Rails は、電子メールの送信に使用され、バックグラウンド処理のために Active Job とうまく統合される Action Mailer フレームワークを提供します。

以下は、Active Job and Action Mailer を使用してパスワード リセット電子メールを送信する方法の例です。

 

この例では、deliver_later を呼び出します。 メーラーでは、送信される電子メールがバックグラウンド ジョブとして自動的にキューに入れられます。 Active Job はバックグラウンドで Sidekiq を使用してこれらのジョブを管理します。

ただし、ジョブをより細かく制御したい場合、たとえば、再試行動作やキューの優先順位付けをカスタマイズしたい場合、または Action Mailer ほど簡単に ActiveJob と統合できないタスクを処理している場合は、別個の Sidekiqjob を作成するのが適切です。

Sidekiq のパフォーマンスと使いやすさに加え、この柔軟性により、Sidekiq は Rails アプリケーションでさまざまなバックグラウンド タスクを処理するための貴重なツールになります。

まとめ

この投稿では、Sidekiq の概要を説明し、その基本を確認し、インストールとセットアップについて詳しく説明し、役立つジョブの作成と実行について説明しました。

また、Sidekiq のより高度な機能について触れ、実際の使用例を検討し、Ruby アプリケーションのパフォーマンスとスケーラビリティの向上におけるその重要な役割について説明しました。

この概要で得た知識を活用すれば、独自の Rails アプリで Sidekiq をより効果的に使用できるようになります。

コーディングを楽しんでください!

追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。


  1. シングルページアプリを...turbolinksのために捨てますか?

    Turbolinks-おそらくRailsの世界で最も軽蔑されている言葉の1つです。 たぶん、あなたはそれを試してみました。新しいプロジェクトまたは既存のアプリにターボリンクを含めました。そしてすぐに、アプリは奇妙で素晴らしい方法で失敗し始めました。修正は同じくらい簡単でした。ターボリンクをオフにしてください。 ...しかし、一部の企業はそれを機能させています。ここHoneybadgerでは、それを機能させました-そして私たちは天才ではありません。 答えはとても単純なので、私はそれを持ち出すのをほとんどためらっています。しかし、RubyNationとMadison+ Rubyでこのテーマに

  2. ミニテストの仕組みの簡単な分析

    ミニテストとは何ですか? MinitestはRubyテストライブラリです 、コードTDDスタイルのテストを作成できます。 これは、Rails&DHHのお気に入りのデフォルトのテストフレームワークです。 一部の人々は、その単純さと、主要な代替手段(RSpec)と比較してコードが少ないことからそれを好みます。 この写真でわかるように : さて、この投稿は、どちらを選ぶべきか、どちらが「より良い」かについてではありません。 この投稿は、ミニテストの仕組みに関するものです。 。 疑問に思っている場合:一番好きな方を使用してください。ただし、両方に精通している必要があります🙂