Open13

sidekiq

philosophynotephilosophynote

SidekiqはRuby言語で書かれた、効率的なバックグラウンドジョブ処理ライブラリです。Redisをバックエンドとして利用し、アプリケーションのパフォーマンスを向上させるために非同期でタスクを処理します。以下に主な特徴をまとめます:

  1. パフォーマンス:

    • Sidekiqはマルチスレッドを利用して高速にジョブを処理します。これにより、リソースを効率的に使用し、スケーラビリティを向上させます。
  2. 信頼性:

    • ジョブはRedis内のデータ構造に保管され、ジョブの実行が中断された場合でも、再開やリトライが可能です。
  3. 監視と管理:

    • SidekiqはWebインターフェースを提供しており、ジョブのキューの状態やパフォーマンスの監視が行えます。
    • Sidekiq ProとSidekiq Enterpriseの有料版では、さらに高度な機能が提供されます(例:バッチ処理、レート制限など)。
  4. 拡張性:

    • Sidekiqはプラグインアーキテクチャを採用しており、様々な追加機能を簡単に組み込むことが可能です。

Sidekiqの導入は以下の手順で行います:

# Gemfileにsidekiqを追加
gem 'sidekiq'

# バンドルインストール
bundle install

# configフォルダ内にsidekiqの設定ファイルを作成
# 例:config/sidekiq.yml

ジョブの定義とキューへの追加は次のように行います:

class HardWorker
  include Sidekiq::Worker

  def perform(name, count)
    # 何らかのバックグラウンドで行いたい処理
    puts "Doing hard work: #{name}, #{count}"
  end
end

# キューにジョブを追加
HardWorker.perform_async('bob', 5)

Sidekiqの使用にはRedisサーバーが必要であることを忘れないでください。これにより、ジョブを保存し、管理するための基盤が提供されます。

philosophynotephilosophynote

SidekiqはRubyのバックグラウンドジョブライブラリです。長時間かかるタスクや非同期処理を別のプロセスで実行することができ、Webアプリケーションのパフォーマンスを向上させることができます。

主な特徴は以下の通りです。

スレッドセーフ
SidekiqはRedisをキューとして使用し、ジョブの重複を防ぎます。Redisがスレッドセーフであるため、Sidekiqもスレッドセーフです。

バックグラウンドでの処理
長時間かかるタスクを別プロセスで実行することができるので、Webアプリケーションのレスポンスを高速に保つことができます。

Retryとスケジューリング
失敗したジョブを自動的に再実行したり、ジョブを将来の特定の時間に実行するようスケジューリングできます。

名前付きキュー
キューに名前をつけることができ、プライオリティの高いジョブを先に実行するなど、優先順位をつけられます。

監視用のWebUI
ジョブのキューイングや進捗状況をWebUIで監視できます。

プラガブルなミドルウェア
独自のミドルウェアを作成して、ジョブの前後に処理を追加できます。

Sidekiqの使い方は、Gemfileにsidekiqを追加して bundle install した後、sidekiq用のワーカープロセスを起動します。そしてRailsのジョブクラスを作成し、Sidekiq::Worker を継承して perform メソッドを実装します。最後に YourWorker.perform_async でジョブをキューイングできます。

philosophynotephilosophynote

https://github.com/sidekiq/sidekiq/wiki/Error-Handling

ベストプラクティス

1.エラーサービスを使う - Honeybadger、Airbrake、Rollbar、BugSnag、Sentry、Exceptiontrap、Raygunなど。どれも似たような機能セットと価格ですが、1つ選んで使ってみてください。エラーサービスは、ジョブで例外が発生するたびにメールを送信します(Honeybadgerのようなスマートなものは、1回目、3回目、10回目の同じエラーでメールを送信するので、1000件のジョブが失敗しても受信トレイがいっぱいになることはありません)。
2.Sidekiqにジョブで発生したエラーをキャッチさせましょう。 Sidekiqのビルトインリトライメカニズムがこれらの例外をキャッチし、ジョブを定期的にリトライします。エラーサービスは例外を通知します。バグを修正し、修正をデプロイすると、Sidekiqはジョブを正常に再試行します。
3.25回の再試行(約21日間)以内にバグを修正しない場合、Sidekiqは再試行を停止し、ジョブをデッドセットに移動します。 今後6ヶ月以内であれば、Web UIを使用していつでも手動でバグを修正し、ジョブを再試行できます。
4.6ヶ月後、Sidekiqはジョブを破棄します。

philosophynotephilosophynote

Active Job
非同期実行処理機能を提供するライブラリ

ActiveJobはアダプターを使ってバックエンドを切り替えることができ、
デフォルトではアダプターとしてasyncが設定されている

asyncアダプターはRailsプロセス中のスレッドでジョブを実行するので、
追加で何かをインストールすることなくジョブを非同期実行できる。
ただし、プロセスを再起動するちキュー中のジョブは失われる

philosophynotephilosophynote

sidekiqを実行するためにRedis環境が必要

https://redis.io/

ChatGPTによる説明

Redisは、オープンソースのインメモリデータストアで、高速なパフォーマンスを特徴としています。データベースとしての役割に加え、キャッシュ、メッセージブローカー、キューシステムなどの用途にも適しています。特徴的な点として以下が挙げられます。

  1. インメモリデータストア: データをメモリ上に保持するため、非常に高速な読み書きが可能です。ディスクへの永続化もサポートしています。

  2. 多様なデータ構造: 文字列、リスト、セット、ハッシュ、ソート済みセット、ビットマップ、ハイパーログログなど、様々なデータ構造をサポートしています。

  3. 分散環境: クラスターやレプリケーション機能を使用して高可用性やスケーラビリティを確保できます。

  4. シンプルなAPI: キー・バリュー形式のAPIでアクセスが容易です。

  5. 多言語サポート: 主要なプログラミング言語向けのクライアントライブラリが存在し、さまざまな言語からアクセスできます。

  6. 拡張機能: Luaスクリプト、トランザクション、パブリッシュ/サブスクライブ、エクスポート/インポート機能も備えています。

Redisは高速なデータ処理が必要なWebアプリケーション、リアルタイム分析、ゲーム、メッセージングシステムなどに幅広く使われています。

https://www.publickey1.jp/blog/24/redisredis.html

philosophynotephilosophynote
AsyncLogJob.perform_later(message: "from sidekiq")

上の段階ではキューに追加がされるが、ジョブ実行はされない

bundle exec sidekiq

sidekiqプロセスを起動してジョブを実行させる

philosophynotephilosophynote

サイドキックの調べたい点

  • ActiveJobとの関係
  • Redisとの関係
  • リトライ処理について
  • トランザクションについて
  • 自動テストについて
  • perform_laterやperform_asyncについて
  • ダッシュボードについて
  • スケジューリングについて
  • エラーハンドリングについて