문제

Ruby on Rails 응용 프로그램에서 50 개의 배경 작업을 병렬로 실행해야합니다. 각 작업은 다른 서버에 대한 TCP 연결을 생성하고 일부 데이터를 보급하고 활성 레코드 객체를 업데이트합니다.

나는이 작업을 수행하기위한 다른 솔루션을 알고 있지만 그 중 하나는 동시에입니다. 예를 들어, DELEDED_JOB (DJ)는 모든 작업을 병렬로 실행할 수 있다면 훌륭한 솔루션이 될 수 있습니다.

어떤 아이디어? 감사.

도움이 되었습니까?

해결책

몇 가지 생각 ...

  • 50 개의 사이트를 읽어야하고 자연스럽게 평행 작업을 원하기 때문에 ~ 아니다 50 개의 프로세스 또는 스레드가 필요하다는 것을 의미합니다. 속도와 오버 헤드의 균형을 맞춰야합니다. 각각 10 개 또는 20 개의 프로세스가 각 사이트를 읽는 것은 어떻습니까?

  • 사용중인 루비에 따라 녹색 스레드에주의를 기울이면 원하는 병렬 결과를 얻지 못할 수 있습니다.

  • 리버스, 클라이언트 측 INETD처럼 구조화하고 사용하고 싶을 수도 있습니다. connect_nonblock 그리고 IO.select 모든 서버가 병렬로 응답하도록하여 원하는 병렬 연결을 얻으려면. 결과의 병렬 처리가 필요하지 않으며, 대기 시간이 실제로있는 곳이기 때문에 모든 서버에서 병렬로 연결되면됩니다.

따라서 소켓 라이브러리에서 이와 같은 것 ... 여러 개의 뛰어난 연결을 위해 확장 ...

require 'socket'
include Socket::Constants
socket = Socket.new(AF_INET, SOCK_STREAM, 0)
sockaddr = Socket.sockaddr_in(80, 'www.google.com')
begin
  socket.connect_nonblock(sockaddr)
  rescue Errno::EINPROGRESS
  IO.select(nil, [socket])
  begin
    socket.connect_nonblock(sockaddr)
    rescue Errno::EISCONN
  end
end
socket.write("GET / HTTP/1.0\r\n\r\n")
# here perhaps insert IO.select. You may not need multiple threads OR multiple
# processes with this technique, but if you do insert them here
results = socket.read

다른 팁

실제로 여러 Delayed_job 근로자를 운영 할 수 있습니다.

에서 http://github.com/collectiveidea/delayed_job:

# Runs two workers in separate processes.
$ RAILS_ENV=production script/delayed_job -n 2 start
$ RAILS_ENV=production script/delayed_job stop

따라서 이론적으로는 다음과 같이 실행할 수 있습니다.

$ RAILS_ENV=production script/delayed_job -n 50 start

이것은 50 개의 프로세스를 생성하지만,이 작업을 수행하는 시스템의 자원에 따라 권장되는지 확실하지 않습니다.


대체 옵션은 사용하는 것입니다 스레드. 각 작업에 대한 새로운 스레드를 스폰하십시오.

이 방법으로 생각해야 할 것은 ActiveRecord 스레드 안전이 아닙니다. 다음 설정을 사용하여 스레드 안전을 만들 수 있습니다.

ActiveRecord::Base.allow_concurrency = true

레일로 작업하기 때문에 Delayed_job을 사용하여 실, 포크로 나누기보다는이 작업을 수행하는 것이 좋습니다. 이유가있는 이유 - 브라우저가 기다릴 때 타임 아웃과 물건을 다루는 것은 진정한 고통이 될 수 있습니다. DJ로 취할 수있는 두 가지 접근 방식이 있습니다

첫 번째는 -50 명 이상의 근로자입니다. 당신의 환경에 따라 이것은 매우 메모리 무거운 솔루션 일 수 있지만 훌륭하게 작동합니다. 그런 다음 일자리를 실행해야 할 때 50 개의 고유 한 작업을 만들어야합니다. 메모리가 너무 많고 이런 식으로 일을하고 싶다면 특히 근로자를 위해 제거 된 별도의 환경을 만드십시오.

두 번째 방법은 Curl :: Multi를 사용하여 50 개의 동시 TCP 요청을 실행하는 단일 작업을 만드는 것입니다. 이에 대한 자세한 내용은 다음을 참조하십시오. http://curl-multi.rubyforge.org/ 그런 식으로 모든 TCP 요청을 병렬로 실행하는 하나의 백그라운드 프로세서가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top