SidekiqとResqueとの互換性
最終更新 2019/02/20 編集者 Mike Perham
Resqueを既に使用しているユーザーがSidekiqを簡単に試すことができるように、Sidekiqを可能な限りResqueと互換性のあるものにしようとしています。
-
Sidekiqは、Resqueとまったく同じメッセージ形式をRedisで使用するため、同じメッセージを処理することもできます。
-
このため、ResqueのクライアントAPIはSidekiqが処理するためのメッセージをRedisにプッシュすることができます。
Sidekiqでは、ワーカーがスレッドセーフである必要があるため、若干異なるワーカーAPIが必要です。
Resqueは、performメソッドがクラスメソッドであると想定しています。これは、Sidekiqのマルチスレッド環境では非常に危険です。(例えば、クラスインスタンス変数が事実上グローバル変数になってしまいます)
Resqueの場合:
class MyWorker
def self.perform(name, count)
# do something
end
end
Sidekiqの場合:
class MyWorker
include Sidekiq::Worker
def perform(name, count)
# do something
end
end
大きな変更ではありませんが、ワーカーの作成がより簡単で直感的になっています。
クライアントAPI
Sidekiqには、ジョブをキューにプッシュするためのResqueと同一のAPIがあるため、プロジェクトで簡単に検索および置換できます。
Resqueの場合:
Resque.enqueue(MyWorker, 'bob', 1)
Sidekiqの場合:
Sidekiq::Client.enqueue(MyWorker, 'bob', 1)
# 下記のコードと同じです。
MyWorker.perform_async('bob', 1)
Sidekiq::Client
にはResqueの resque-scheduler
との互換性のための enqueue_in
もあります。
パフォーマンス
resqueおよびdelayed_jobはどちらもシングルスレッドプロセス設計を使用しており、これはスレッドベースと比較して非効率です。Sidekiqは通常、桁違いに高速です。
機能性
Sidekiqには、そのままの状態でResqueよりも多くの機能が含まれています。例えば、Sidekiqには、resque-scheduler、resque-web、resque_mailer、resque-retryのほとんどの機能がgemに含まれており、それらの機能を使用するためのカスタム構成はほとんど必要ありません。
プラグイン
Sidekiqは、Resqueのコールバックベースのプラグインをサポートしていません。ジョブの処理に関するコードを実行する独自のフックを登録するためのMiddleware APIを提供します。
制限事項
ResqueクライアントAPIでキューに入れられたジョブには、ペイロードに再試行のためのパラメーターがありません。
これは、失敗したジョブは自動的に再試行されないことを意味します。再試行機能が適切に動作するようにSidekiq APIを使用してコードを移行してください。
Redis
Resqueでネームスペースを使用している場合は、同じネームスペースを使用するようにSidekiqを構成してください。
そのためには、下記のコードを sidekiq.rb に追加します。
# Add gem 'redis-namespace' to your Gemfile too
Sidekiq.configure_client do |config|
config.redis = { namespace: 'resque' }
end
Sidekiq.configure_server do |config|
config.redis = { namespace: 'resque' }
end