우선, 와우, 레일즈 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 피트 뷰에서 볼 수 있지만 필자는 시작을위한 뭔가가 있기를 바랍니다.
DelayedJob 또는 BackgroundJob을 사용하여이 접근 방식을 사용할 것을 진지하게 고려하고 싶습니다. 그들은 직업 추적과 폴링을 처리하여 앱 코드에 집중할 수 있습니다. Ajax를 통한 상태보고는 처리중인 객체의 상태 필드를 업데이트하여 수행 할 수 있습니다. –