내 Rails 앱에는 텍스트 메시지와 이메일을 통해 사용자에게 연락하는 컨트롤러 작업이 있습니다. 내가 들어 가지 않을 이유가 있기 때문에 이메일을 성공적으로 보내기 전에 문자 메시지를 작성해야합니다.Sidekiq : perform_async 및 순서 종속적 인 작업
컨트롤러 :
class MyController < ApplicationController
def contact_user
ContactUserWorker.perform_async(@user.id)
end
end
근로자 : 나는 원래 이런 걸했다
class ContactUserWorker
include Sidekiq::Worker
def perform(user_id)
SendUserTextWorker.perform_async(user_id)
SendUserEmailWorker.perform_async(user_id)
end
end
class SendUserTextWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find(user_id)
user.send_text
end
end
class SendUserEmailWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find(user_id)
user.send_email
end
end
이 신뢰할 수없는되었다; 때로는 이메일이 실패하고 때로는 실패 할 수도 있습니다. perform_async
이 문제의 원인인지 여부를 확인하려고합니다. 텍스트가 완료되기 전에 async
부분이 전자 메일을 시작하도록 허용 했습니까? 나는 정확히 어떻게 perform_async
가 작동하는지에 대해 조금 퍼지지만, 그것은 합리적인 추측처럼 들렸다. 결국하지만
class ContactUserWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find(user_id)
User.send_text
SendUserEmailWorker.perform_async(user_id)
end
end
, 난 그냥 모두 노동자 중 send_text
로 통화를 이동 컨트롤러에 :
은 처음에는에 ContactUserWorker
를 리팩토링
class MyController < ApplicationController
def contact_user
@user.send_text
SendUserEmailWorker.perform_async(@user.id)
end
end
이것은 단순화 실제 코드의 버전이지만 그게 그 핵심입니다. 사이드 킨과 관련된 문제인지 아니면 다른 문제가 있는지 궁금해 할지라도 지금은 잘 작동하고있는 것 같습니다.
이메일 전화를 제외한 모든 통화에 perform_async
대신 perform
을 사용하면 원래 구조가 작동했는지 여부가 궁금합니다. 이처럼 :
class MyController < ApplicationController
def contact_user
ContactUserWorker.perform(@user.id)
end
end
class ContactUserWorker
include Sidekiq::Worker
def perform(user_id)
SendUserTextWorker.perform(user_id)
SendUserEmailWorker.perform_async(user_id)
end
end