2012-01-19 7 views
3

레일스에 익숙하지 않고 일반적으로 개발에 익숙해 졌기 때문에 이것이 기본적인 질문이라면 사과드립니다. 옵트 인 사용자에게 대량 이메일 (예 : 뉴스 레터)을 보내려는 앱이 있습니다. 나는 두 가지의 염려가있다 : (1) 내 코드는 대량 메일을 처리하는 가장 효율적인 방법이다 (즉 for ... each 문을 사용해야 할 필요가있다). (2) Stack Overflow에서 중요성에 대해 말하는 다른 게시물을 읽는다. 지연된 작업을 사용하여 전자 메일을 보냅니다.레일즈 3 매스 이메일

다른 일들이 참고 : 나는에게 Heroku에있어

내 질문에 따라 나는 지연 추가 된 SendGrid

  • 작업 코드를 사용하는 방법에 대한 생각
  • 은 다음과 같습니다 :

    1. 대부분의 p eople는 단일 수신자 이메일 (즉, 사용자 등록 확인)에 대해서도 지연된 작업을 사용합니까?
    2. 제 코드는 대량 이메일을 보내는 가장 효율적인 방법입니까?
    3. 예를 들어 1000 명의 사용자가있는 경우 모든 사람에게 BCC와 동일한 이메일을 보내는 경우 리소스 (예 : 대역폭, CPU 등)에 큰 차이가 있는지 확인합니다. 그렇다면 메일러에 해시를 전달 (for ... each를 삭제하고 opt_in_user 매개 변수를 @opt_in_users로 변경)하고 수신자를 숨은 참조로 변경 하시겠습니까?

    고마워요!

    컨트롤러

    commmunity_users = UserCommunityRelation.find('community_id = ? and status = ?,'  current_community, "approved") 
    @opt_in_users = User.find('opt_in = ?,' true) 
    
    @opt_in_users.each do |opt_in_user| 
        UserMailer.send_later(:deliver_announcement, opt_in_user) 
    end  
    

    UserMailer.rb 보내는 대량 들어

    def announcement(opt_in_user) 
        mail(:to => "#{opt_in_user.username} <#{opt_in_user.email}>", :subject => "Huge Announcement!") 
    end 
    
  • 답변

    2

    , 당신은 확실히 서비스 (우리는 우체통을 사용 SendGrid 다른 옵션)를 통해 보내해야합니다. 서버에 대한 부하 외에도 서비스는 반송, 스팸 차단기 등에 더 잘 맞을 것이고 아마도 추적과 같은 추가적인 이점을 제공 할 것입니다.

    대부분의 사람들은 단일 수신자 전자 메일 (예 : 사용자 등록 확인)에도 지연된 작업을 사용합니까?

    단일 사용자 이메일의 경우 컨트롤러에서 직접 이메일을 사용합니다.

    제 코드는 대량 메일을 보내는 가장 효율적인 방법입니까?

    사이트의 응답성에 영향을주기 때문에 제어기 작업으로 작업 대기열을 관리하지 않으려합니다. cron 작업 및 rake 작업을 사용하여 백그라운드에서 수행하십시오.

    예를 들어 1000 명의 사용자가있는 경우 모든 사람에게 BCC와 동일한 이메일을 보내는 경우 리소스 (예 : 대역폭, CPU 등)에 큰 차이가 있는지 확인합니다. 그렇다면 메일러에 해시를 전달 (for ... each를 삭제하고 opt_in_user 매개 변수를 @opt_in_users로 변경)하고 수신자를 숨은 참조로 변경 하시겠습니까?앞서 언급 한 바와 같이 나는 BCC 생각

    나는 서비스와 함께 가고 싶어, 자원 사용에 대한 괜찮지 만, 서버는 모든 반송에 박히는 것, 따라서, 관리 할 수있는 추가 서비스입니다

    BTW, # 각 vs 각 질문에 대해 iterator의 비용은 너무 낮아서 IMO에 대해 생각할 가치가 없습니다.

    +1

    일회용 이메일의 경우에도 여전히 SendGrid를 사용합니다. 더 나은 전달, 주로 2 차적으로 분석. –

    +1

    또한 가능한 경우 외부 서비스와 상호 작용하고 처리하는 데 걸리는 시간을 모르기 때문에 지연된 작업을 사용하려고합니다. 백그라운드에서 처리하고 사용자에게 제어권을 돌려 보냅니다. –