サイドキイドライ


新しい宝石を発表しました.sidekiq-dry 多様性に取り組む
それが来るとき、一般的な欲求不満Sidekiq 仕事と彼らの議論.

根拠


SideKiqは最も人気のあるバックグラウンドジョブソリューションの一つです.私のです
Rubyアプリの第一選択.The dry-rb 宝石の家族も
非自明なアプリケーションに不可欠です.我々が2を結合するならば、...

With sidekiq-dry 場合はDry::Struct 引数として
あなたのsidekiq仕事に.でもどうして?

タイプあいまいさを防ぐ


何度も仕事をデバッグしなければならなかった
無効な引数でエンキューされます.
例:
class SendInvitationEmailJob
  include Sidekiq::Worker

  def perform(user_id, invitee_email)
    # code
  end
end
SendInvitationEmailJob.perform_async(user.id, params[:invitee_email])
上記のコードの問題は、user_id でない
整数のIDinvitee_email が有効なメール文字列ではない
enqueuedジョブが完了するチャンスは全くありません
成功しました.もちろんDry::Struct は検証に使用されません.
があるdry-validate あるいはActiveModel / ActiveRecordご希望の場合は妥当性検査を行います.あなたのより多くの構造を与える
バックグラウンドジョブの引数は、システムの堅牢性を向上させます.あなたのオブジェクト
輸送においてRedis , ジョブがエンキューされている限り、
ジョブが実行されるときに期待される構造を持つことが保証されます.
上の例は以下のようにリファクタリングされます:
class SendInvitationEmailJob
  include Sidekiq::Worker

  def perform(params)
    # code
  end
end
class SendInvitationEmailJob::Params < Dry::Struct
  attribute :user_id, Types::Strict::Integer
  attribute :invitee_email, Types::Strict::String.constrained(format: /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i)
end
job_params = SendInvitationEmailJob::Params.new(user_id: user.id, invitee_email: params[:invitee_email])

SendInvitationEmailJob.perform_async(job_params)
この時点で、私たちはハッシュの代わりにDry::Struct ?
さて、ハッシュ引数は驚きにつながることができるストリングキーで逆シリアル化されます.

位置引数を削除する


バックグラウンドジョブが2つ以上の位置引数をとると
1つのstructオブジェクトを取るためにそれをリファクタ
分かりやすい名前.
Rails Worldでは、レコードを使ってジョブをenqueueするのが一般的ですid .
この模様はどこも悪い.しかし、場合によっては、開発者は
モデルの後に盲目的にモデル.

ドキュメント


使用によってDry::Struct あなたが制約を表すことができる引数
あなたのコードでまっすぐ.各ジョブ引数の型を記述する代わりに
簡単に時代遅れになることができ、structの属性の型を参照できます.
class Post < Dry::Struct
  attribute :title,  Types::Strict::String
  attribute :tags,   Types::Array.of(Types::Coercible::String).optional
  attribute :status, Types::String.enum('draft', 'published', 'archived')
  attribute :body,   Types::String.constrained(min_size: 10, max_size: 10_000)
end
おそらく、上記の例では、両方の種類と制約が読みやすさを改善します.

バージョン管理


この宝石を追加すると、アプリケーション内の既存のジョブを中断しません.
これはジョブのキューに登録されていますDry::Struct オブジェクト.
パラメータ構造体に新しい属性を追加すると、すでにenqueuedされたジョブが中断されません.
いずれかを使用して構造体のバージョンには些細ですversion 属性
class Coupons::ApplyCouponJob::Params < Dry::Struct
  attribute :user_id,     Types::Strict::Integer
  attribute :coupon_code, Types::Strict::String
  attribute :version,     Types::Strict::String.default('1')
end
またはversionedクラス:
class Coupons::ApplyCouponJob::Params::V1 < Dry::Struct
  attribute :user_id,     Types::Strict::Integer
  attribute :coupon_code, Types::Strict::String
end

警告


ジョブ処理ライブラリSideKIQと互換性があります
exq , あなたのdry ::struct引数を見捨てません.これはおそらく許容できるトレードオフです.

宝石


宝石はrubygems上でホストされていますlink ). これは2つのsidekiqを提供します
のインスタンスをシリアル化して逆シリアル化するミドルウェアDry::Structあなたの仕事の議論.

インストール


宝石ファイルに宝石を追加します.
gem 'sidekiq-dry'
構成Sidekiq 宝石のミドルウェアを使用するには:
# File: config/initializers/sidekiq.rb

Sidekiq.configure_client do |config|
  config.client_middleware do |chain|
    chain.add Sidekiq::Dry::Client::SerializationMiddleware
  end
end

Sidekiq.configure_server do |config|
  config.server_middleware do |chain|
    chain.add Sidekiq::Dry::Server::DeserializationMiddleware
  end
end

更なる読書

  • dry-rb
  • dry-types
  • 他の便利なライブラリやポストについては、私のtefterを購読するRuby & Rails リスト.