2011-04-06 6 views
1

현재 레일 1.2.7에서 실행되는 레거시 레일 애플리케이션을 관리하고 있습니다. 기능 중 하나는 사람들이 사운드를 업로드하고 백틱을 사용하는 명령 줄 도구를 사용하여 사운드를 변환하도록 허용하는 것입니다. 현재 AJAX 폴링을 사용하여 컨트롤러 작업을 통해 변환 관리를하고 있지만 컨트롤러 작업의 마지막 요소가 발생하지 않고 있음을 의미하는 시간 초과 문제가 있습니다.레일 위에 비동기 작업 시스템이 있습니까?

낮은 오버 헤드가 필요한 시스템입니다.이 백그라운드 변환을 관리하고 배경 변환으로 생성 된 문제에 대해 이벤트 시스템에서 응답하려면 어떻게해야합니까? 나는 eventmachine을보고 있었지만 여전히 100 %가 아니며 사용할 수있는 비동기 작업 기반 시스템이 있습니까?

답변

1

우선, 와우, 레일즈 1.2.7. 나는 레일즈 3으로 천천히 업그레이드하고있는 유사하게 오래된 앱을 가지고있다. 얼마나 빨리이 물건이 바뀌는 지 미친.

확실히 재미있는 문제입니다. 당신이 이것을 취할 수있는 방향이 많이 있으며, 당신의 과정을 잘 모르겠다. 그래서 나는 한 쌍을 제안 할 것이다. 내 이해는 1) 파일 업로드, 2) 변환 시작, 3) 아약스 폴링을 통한 전환 상태보고.

먼저 레일스 컨트롤러 액션에서 변환 유틸리티를 실행하는 것은 분명히 알 수있는 방법입니다. 1) 웹 서버 나 브라우저가 요청을 죽일 것입니다. 2) 대부분의 레일스 배포는 앱당 한 번에 하나의 요청 만 허용합니다. 즉 동시 사용자 5 명을 업로드하려면 5 개의 앱 사본이 필요합니다. 분명히 그것은 확장되지 않을 것입니다.

"업로드"작업은 가능한 빨리해야합니다. 그것은 1) 파일을 업로드해야하고, 2) 다른 작업 과정에서 처리 할 "전환 작업"을 예약하거나 실행을 중지해야합니다. 폴링 작업은 그 작업의 상태를보고합니다. 물론 문제는 다른 프로세스가 있어야한다는 것입니다. 내가 그 접근 방식에 대한 신뢰도를 보장 할 수 있지만

아이디어 1 http://geekblog.vodpod.com/2007/08/17/background-processing-in-rails/는 가능성이 시작하기에 좋은 장소입니다.

아이디어 2 나는 이와 비슷한 것을 했으므로 자세히 설명 할 수 있습니다. 아마 더 잘 확장 될 것입니다. Sinatra 또는 Async Sinatra를 사용하여 경량 컴패니언 앱을 제작하십시오. Rails 애플리케이션은 데이터베이스에 업로드 된 파일에 대한 작업을 기록하지만 그 부분이 완료된다. Sinatra 앱은 EventMachine을 사용하여 몇 초마다 db를 폴링하고 새로운 작업을 시작합니다. n 개의 병행 작업으로 제한하여 DOS 상자에 넣지 않아도됩니다. 사용자가 Sinatra 앱을 폴링하여 변환 상태를 확인할 수 있습니다.

아이디어 3와 유사하지만 동반자 웹 응용 프로그램 대신 EventMachine을 사용하는 작은 루비 프로그램입니다. 당신은 당신의 서버에서이 프로그램을 시작하고 영원히 돌아 가게 할 것입니다. 각 작업은 자신의 상태를 다시 데이터베이스에 기록하여 사용자가 Rails 앱을 통해 폴링 할 수 있습니다. 나는 이것이 내가 제일 좋아하는 것 같아. 와이어 프레임 :

#!/usr/bin/env ruby 
require 'rubygems' 
require 'eventmachine' 

# Returns new jobs from the database 
def new_jobs 
    [] 
end 

# Convert the file 
def convert(job) 
    `convert #{job.path}` 
    job 
end 

# Callback when conversion is complete 
def callback(job) 
    puts "Finished #{job.path}!" 
end 

EventMachine::run do 
    # Run every 5 seconds 
    EventMachine::add_periodic_timer(5) do 
    new_jobs.each { |job| EventMachine::defer convert(job), callback(job) } 
    end 
end 

이 제안 사항은 10,000 피트 뷰에서 볼 수 있지만 필자는 시작을위한 뭔가가 있기를 바랍니다.

+1

DelayedJob 또는 BackgroundJob을 사용하여이 접근 방식을 사용할 것을 진지하게 고려하고 싶습니다. 그들은 직업 추적과 폴링을 처리하여 앱 코드에 집중할 수 있습니다. Ajax를 통한 상태보고는 처리중인 객체의 상태 필드를 업데이트하여 수행 할 수 있습니다. –