2015-08-26 14 views
1

this question有關,它解釋了控制器中邏輯的起源,在推遲到github並重新部署之前,我有一個延遲作業背景作業的問題。這是對Delayed Job,Rails和Mandrill的預期行爲嗎?

的型號和範圍的工作,在控制器(一個或多個)邏輯的作品,在電子郵件text.erb文件的工作條件語句,用戶要麼是讀者或用戶,可以設置自己的電子郵件偏好他們的「我的帳戶」頁面:[文章&更新,只是文章,沒有電子郵件等]。延遲作業在後臺進行設置和處理,使得前端儘可能快速,並且Mandrill SMTP可以正確接收並正確地發送電子郵件。

article_controller主要邏輯塊這樣做是爲了正確的電子郵件發送給正確的用戶:

if @article.update(article_params) && @article.status == 'published' && @article.created_at.today? 
    User.wantsarticles.editor.each do |user| 
     ArticleMailer.delay.send_article_full(@article, user) 
    end 
    User.wantsarticles.subscribers.each do |user| 
     ArticleMailer.delay.send_article_full(@article, user) 
    end 
    User.wantsarticles.readers.each do |user| 
     ArticleMailer.delay.send_article_teaser(@article, user) 
    end 
    format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' } 
    format.json { render :show, status: :ok, location: @article } 
    else 
     format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' } 
     format.json { render :show, status: :ok, location: @article } 
    end 

縱觀Rails和延遲作業日誌,雖然與測試集的剛幾個用戶(5-10)中,當循環通過所述邏輯並決定3電子郵件需要被髮送出去,滑道是做3個INSERT INTO DJ臺和DJ然後執行此爲每一個:

Job NewsitemMailer.send_article_full (id=21) RUNNING 
Job NewsitemMailer.send_article_full (id=21) COMPLETED after 0.8950 

然後當它完成後,我牛逼報告回來了:

3 jobs processed at 0.9039 j/s, 0 failed 

而在山魈日誌,發送的每封郵件都有自己的API「成功/失敗」的條目。

所以:這是延遲作業的正確/預期的行爲?是否應該爲每封電子郵件創建一份工作?或以不同的方式處理它們?當我們開始做X千而不是十/三時,這種做法是否會破壞服務器?

回答

1

這看起來像delayed_job的默認行爲。你有ArticleMailer.delay電話3次,它排隊所有,因此你看到3 jobs processed

我想,你還應該看的handle_asynchronously功能。

另外,如果你打算處理的郵件數量巨大,我建議你去探索其他選項,例如Resquesidekiqbeanstalkd

他們比delayed_job更好的時候,要處理大量的就業機會。 delayed_job設置簡單易行,但可能會遇到性能問題。

請參閱this以獲得總覽。

+1

謝謝KM!是的,這只是一個簡單的開始,讓事情繼續下去,並瞭解這些事情是如何工作的。我們將看到它對服務器的作用。我們一定會考慮你稍後提到的其他選項。 –

相關問題