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.)