sidekiq-dry
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
추가 자료
다른 편리한 라이브러리 및 게시물을 보려면 내 TefterRuby & Rails 목록을 구독하십시오.
Reference
이 문제에 관하여(sidekiq-dry), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zorbash/sidekiq-dry-17ol텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)