2013-04-01 4 views
0

내 레일 애플리케이션에는 처리하는 데 많은 시간이 걸리는 경로가있어 전체 웹 페이지가 정지됩니다.Rails 액션 컨트롤러가 스레드를 사용하지 않는 이유는 무엇입니까?

  1. 왜 이런 일이 발생합니까? 쓰레드에 안전하지 않은 레일이나 써드 파티 젬이 있습니까?
  2. 이 문제를 해결할 방법이 있습니까? 스레드 풀처럼 프로세스 풀을 사용하는 것을 고려 중입니다. 무거운 것을 제외하고는 많은 메모리가 필요하지만 전체 응용 프로그램을 중지하는 것보다 비용이 적을 것입니다.
+2

문제를 해결하기 위해 더 많은 정보가 필요합니다. 요청하는 동안 무슨 일이 일어나고 있습니까? 다른 보석들이 관련되어 있다면, 그것들은 무엇입니까? –

+0

기본 레일에 수정 내용을 추가하지 않았습니다 (config.threadsafe를 false로 설정). 컨트롤러가 이전 요청을 처리하는 동안 다음 요청은 대기 중입니다. –

+0

컨트롤러에서 무슨 일이 일어나고 있는지에 대한 정보가 없으면 정확한 답변을 드릴 수 없습니다. 할 수있는 모든 것은 추측이며 이는별로 유용하지 않습니다. 코드를 요약해야하므로 느린 부분을 식별하고 수정을 시도 할 수 있습니다. –

답변

2

먼저 알아둬야 할 것이 레일 액션입니다. 사용자가 페이지를 요청하면 바로 사용자에게 서비스를 제공해야합니다.

사용자가 결과를 기다려야하는 경우가 있습니다.이 경우 항상 웹 소켓 또는 HTTP streaming을 사용할 수 있습니다.

이제 Ruby와 Rails는 스레드에 문제가 있습니다.이 스레드는 "Parallelism is a Myth in Ruby"에서 읽을 수 있습니다.

는 은, 당신이 원하는대로 포크 많은 프로세스 노동자 유니콘 같은 서버를 사용하는 당신이 레일에서 사용할 수있는 솔루션입니다

, 그리고 각각의 하나는 등, 푸마 멀티 스레드를 생성

을 다른 독립적으로 작업 할

무거운 프로세스 인 작업이있는 경우 delayed_job과 같은 프로세스 풀로 작업을 지연시킬 수 있습니다. 자바 스크립트로 멋진 UI를 만들어 작업 상태를 가져와 사용자에게 진행 상황을 보여줄 수도 있습니다. RabbitMQ로 작업 풀을 사용할 수 있습니다. 백그라운드에서 다른 프로세스가 새 메시지를 듣고 응답하고 심지어 응답을 할 수도 있습니다.

대부분의 웹 서버에는 클라이언트가 있습니다 시간 초과가 발생하고 사용자가 응답하지 않고 1 분 이상 기다려야하는 것을 원하지 않으므로 작업이 완료되는 동안 즉시 스트림 응답을 사용하여 일부 의견을 제공하거나 일부 JavaScript 코드로 응답하는 것이 좋습니다 작업이 어떻게 수행되고 있는지, 심지어 필요하다면 웹 소켓까지 서버를 계속보고있을 것입니다.

2

레일즈는 미들웨어 스택의 전체 요청에 대해 뮤텍스 잠금을 사용하므로 레일스 프로세스는 한 번에 하나의 요청 만 처리합니다.

그러나 config.threadsafe! 옵션을 활성화하고 Puma와 같은 다중 스레드 서버를 사용하여이 기능을 비활성화 할 수 있습니다.

MRI를 사용하는 모든 장애물로 인해 논 블로킹 I/O를 수행하지 않는 한 실제로 두 개의 스레드가 동시에 실행되지 않습니다.

Rubinius 또는 Jruby와 같은 실제 스레드를 지원하는 Ruby 구현을 사용해야합니다.