2009-05-22 7 views
28

새로운 자원이 생성하고 현재 요청 등을 보유하지 곳은 일부 긴 처리을 할 필요가 자원이 준비되기 전에, 어떻게 멀리 배경에 그 처리를 보내려면 어떻게합니까 때 내 웹 앱에 대한 트래픽? 내 모델Ruby on Rails : 백그라운드에서 실행하는 방법?

:

class User < ActiveRecord::Base 
after_save :background_check 

protected 
def background_check 
    # check through a list of 10000000000001 mil different 
    # databases that takes approx one hour :) 
    if(check_for_record_in_www(self.username)) 
    # code that is run after the 1 hour process is finished. 
    user.update_attribute(:has_record) 
    end 
end 
end 

답변

39

당신이해야 확실히 다음 Railscasts 체크 아웃 :

그들은 가능한 모든에 레일의 백그라운드 프로세스를 실행하는 방법을 설명합니다 길 (aq의 유무에 관계없이) ueue ...)

+2

요즘 가장 많이 사용되는/최고의 지원 옵션입니다 [sidekiq] (https://github.com/mperham/sidekiq), [resque ] (https://github.com/defunkt/resque) 및 [delayed_job] (https://github.com/collectiveidea/delayed_job)을 참조하십시오. IMHO, Sidekiq는 처리량이 많은 대기열에 가장 적합한 Sidekiq이며 delayed_job은 처리량이 낮을 때 가장 좋습니다. –

+0

"IronWorkser"(http://www.iron.io)는 백그라운드 처리를 "서비스"로하고 서버 나 대기열에 대해 걱정할 필요가 없도록합니다. IronMQ/IronWorker는 자동 재시도, 작업 로그, 웹 훅 (webhook) 등을 제공합니다. Rails와 잘 통합됩니다. 다음은 몇 가지 동영상입니다. https://www.youtube.com/user/ironiodevelopers – Chad

7

는 'nohup을'을 붙이는 당신이 그것을 전달하는 명령의 마지막에 '&'를 추가, 아마도 가장 쉽게 system 함께 할 수있는 별도의 프로세스를 시작합니다. (명령이 하나 개의 문자열 인수가 아닌 인수 목록 있는지 확인합니다.)

스레드를 사용하려고하면 오히려 말,보다, 이런 식으로하고 싶은 몇 가지 이유가 있습니다 :

  1. 루비의 스레드는 I/O를 할 때 약간 까다로울 수 있습니다. 당신이해야 할 일이 전체 과정을 방해하지 않도록주의해야합니다.

  2. 다른 이름으로 프로그램을 실행하면 'ps'에서 쉽게 식별 할 수 있으므로 실수로 FastCGI 백엔드가 거칠어 졌다고 생각하지 않고 죽일 수 있습니다.

정말로, 시작하는 프로세스는 "제거"되어야하며, 도움을 받으려면 Daemonize 클래스를 참조하십시오.

2

자신 만의 글을 작성하는 대신 기존 백그라운드 작업 서버를 사용하는 것이 이상적입니다. 이것들은 일반적으로 당신이 직업을 제출하고 그것에게 유일한 열쇠를 줄 수 있습니다; 그런 다음 키를 사용하여 웹 응용 프로그램을 차단하지 않고 작업 서버에 작업 상태를 주기적으로 쿼리 할 수 ​​있습니다. here is a nice roundup 다양한 옵션이 있습니다.

0

무엇에 대해 :

def background_check 
    exec("script/runner check_for_record_in_www.rb #{self.username}") if fork == nil 
end 

프로그램 "check_for_record_in_www.rb"다음 다른 프로세스에서 실행되고 데이터베이스에 액세스 할 수있는, 액티브에 액세스 할 수 있습니다.

1

저는 backgroundrb를 사용하기를 좋아합니다. 긴 프로세스에서 의사 소통을 할 수 있습니다. 그래서 레일 앱에서 상태 업데이트를 할 수 있습니다

1

내 생각에 spawn은 프로세스를 포크하여 백그라운드에서 처리하고 사용자에게이 처리가 시작되었다는 확인을 표시하는 좋은 방법입니다.

6

나는 단지 'delayed_job'보석을 실험 해왔다. 왜냐하면 Heroku 호스팅 플랫폼과 작동하기 때문에 그것은 설치하기가 엄청나게 쉬웠다 !!

Gemfile에 gemfile을 추가하려면, bundle install, rails g delayed_job, rake db:migrate 다음을 사용하여 큐 핸들러를 시작하십시오. 당신은 당신이 그것을 변경

company.send_mail_to_all_users 

즉 당신의 긴 과정이다 메소드 호출이

RAILS_ENV=production script/delayed_job start 

;

company.delay.send_mail_to_all_users 

확인 GitHub의에서 전체 문서 : https://github.com/collectiveidea/delayed_job