sidekiq-dry

11621 단어 rubysidekiqdryrbrails
다양한 문제를 해결하는 것을 목표로 새로운 보석sidekiq-dry을 게시했습니다.
Sidekiq 직업과 그들의 주장에 관한 일반적인 좌절.

이론적 해석



Sidekiq은 가장 인기 있는 백그라운드 작업 솔루션 중 하나입니다. 그건 내
Ruby 앱의 첫 번째 선택입니다. dry-rb 보석 계열도
사소하지 않은 응용 프로그램에서 없어서는 안될 필수 요소입니다. 둘이 합체하면 뭐..


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
정수 ID 또는 invitee_email는 유효한 이메일 문자열이 아닙니다.
대기 중인 작업이 완료될 가능성은 전혀 없습니다.
성공적으로. 물론 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 대신 해시를 전달하면 어떻게 될까요?
음, 해시 인수는 놀라움으로 이어질 수 있는 문자열 키로 역직렬화됩니다.

위치 인수 제거



백그라운드 작업이 두 개 이상의 위치 인수를 취하는 경우
단일 구조체 개체를 사용하도록 리팩터링하는 것이 좋습니다.
이해하기 쉬운 이름.

Rails 세계에서는 작업을 레코드id로 대기열에 넣는 것이 일반적입니다.
이 패턴에는 잘못된 것이 없습니다. 그러나 경우에 따라 개발자는 다음을 정의할 수 있습니다.
관습을 맹목적으로 따르는 모델.

선적 서류 비치


Dry::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


틀림없이 위의 예에서 유형과 제약 조건 모두 가독성을 향상시킵니다.

버전 관리



이 gem을 추가해도 앱의 기존 작업이 중단되지 않습니다.Dry::Struct 개체가 대기열에 포함된 작업에서만 작동합니다.

매개변수 구조체에 새 속성을 추가해도 이미 대기열에 포함된 작업이 중단되지 않습니다.
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


또는 버전이 지정된 클래스:

class Coupons::ApplyCouponJob::Params::V1 < Dry::Struct
  attribute :user_id,     Types::Strict::Integer
  attribute :coupon_code, Types::Strict::String
end


주의 사항



예를 들어 Sidekiq과 호환되는 작업 처리 라이브러리
exq , Dry::Struct 인수를 역직렬화하지 않습니다. 이는 수용 가능한 절충안일 가능성이 높습니다.

보석



gem은 rubygems( link )에서 호스팅됩니다. 2개의 Sidekiq을 제공합니다.
인스턴스를 직렬화 및 역직렬화하는 미들웨어Dry::Struct귀하의 작업에 인수.

설치



Gemfile에 gem을 추가합니다.

gem 'sidekiq-dry'


gem의 미들웨어를 사용하도록 구성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

  • 다른 편리한 라이브러리 및 게시물을 보려면 내 TefterRuby & Rails 목록을 구독하십시오.

    좋은 웹페이지 즐겨찾기