Ruby on Rails에서 스레딩, 동시성 및 포크 프로세스에 대한 현재의 상황은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/129226

  •  02-07-2019
  •  | 
  •  

문제

Ruby on Rails는 멀티 스레드 요청-응답을 잘 수행하지 않거나 적어도 ActiveRecord를 수행하지 않습니다.

동시에 하나의 요청-응답 능력이라는 개념은 완료하는 데 시간이 오래 걸리는 쉘 커뮤니케이션을 포크하는 웹 응용 프로그램을 만들 때 번거 로울 수 있습니다.

이런 종류의 설정에 대한 귀하의 견해 중 일부는 무엇입니까? 레일은 일부 응용 프로그램에 적합하지 않습니까?

또한 Ruby on Rails의 동시성과 관련하여 현재의 상황은 무엇입니까? 모범 사례는 무엇입니까? 단점에 대한 해결 방법이 있습니까?

도움이 되었습니까?

해결책

Rails는 현재 단일 MRI (Matz Ruby 통역사) Ruby 프로세스 내에서 동시 요청을 처리하지 않습니다. 각 요청은 본질적으로 거대한 뮤텍스로 포장됩니다. 다가오는 Rails 2.2 스레드-안전을 만들기 위해 많은 작업이 진행되었지만 Ruby 1.8x에서 달릴 때 많은 혜택을 얻지 못할 것입니다. 나는 그것에 익숙하지 않기 때문에 루비 1.9가 다른지에 대해서는 언급 할 수 없지만 아마도 생각하지 않았을 것입니다.

JVM은 일반적으로 멀티 스레딩에 능숙하다고 인정되기 때문에 이와 관련하여 매우 유망한 영역은 Jruby를 사용하여 레일을 운영하는 것입니다. Arun Gupta Sun Microsystems에서 일부를 주었다 흥미로운 성능 인물 최근 Railsconf Europe 에서이 설정에서.

다른 팁

Neverblock 프로그램 작성 방식을 수정하지 않고도 차단 기능을 허용합니다. 정말 흥미 진진한 프로젝트이며 Ruby 1.8.x (Ruby 1.9의 섬유에 의존)에서 작업하기 위해 백포링되었습니다. PostgreSQL 및 MySQL 모두에서 작동하여 비 블로킹 쿼리를 수행합니다. 그만큼 벤치 마크 미쳤어 ...

Matz의 Ruby 1.8은 사용합니다 녹색 실, Matz의 Ruby 1.9는 기본 O/S 스레드를 사용합니다. Jruby 및 Ironruby와 같은 Ruby 1.8의 다른 구현은 기본 O/S 스레드를 사용합니다. 또 다른 Ruby VM의 경우 짧은 Yarv는 기본 O/S 스레드를 사용하지만 글로벌 통역사 잠금 장치가있어 하나의 루비 스레드 만 주어진 시간에 실행되도록합니다.

쉘에서 실행되는 것이 페이지 렌더링에 필요하지 않은 경우 (예 : 유지 보수 작업을 트리거하는 것만) 배경 프로세스로 시작해야합니다. Starling과 Workling을 확인하십시오.

이것이 상황에 적용되지 않으면 앱 서버의 여러 인스턴스가 실행되도록해야합니다. 전통적으로 사람들은 여러 가지 Mongrel 사례를 시작할 것입니다. 하지만 이제는 견고한 설정을하는 가장 쉬운 방법은 지금까지 사용하는 것입니다. PHOUNCE 승객. 실행중인 앱 서버의 인스턴스 (최소 및 최대) 수를 쉽게 지정할 수있는 Apache 모듈입니다. 승객은 나머지를합니다. 그리고 내가 올바르게 기억한다면, 요청을 파견하기 위해 바보 같은 라운드 로빈을하지 않습니다. 나는 그것이 가용성에 의한 것이라고 생각합니다.

루비 1.9는 경량 섬유를 추가하고 있습니다.

http://www.infoq.com/news/2007/08/ruby-1-9-fibers

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