2012-01-20 3 views
10

레일즈에서 웹 애플리케이션을 작성하려고합니다. 사용자가 요청한 각 요청은 호출되는 외부 API에 따라 다릅니다. 이 외부 API는 무작위로 매우 느릴 수 있으며 (2-3 초), 이는 분명히 개별 요청에 영향을 미칩니다.IO/Ruby on Rails 차단하기

외부 API가 돌아 오기를 기다리는 코드가 실행되는 동안 추가 사용자 요청이 차단됩니까?

  1. 앨리스 내 웹 응용 프로그램에 요청을 :

    그냥 더 명확한 설명이 내가 기대하고있어 모델, 혼란을있을 것 같습니다있다. 이를 수행하기 위해 API 서버 A에 대한 호출이 이루어집니다. API 서버 A가 느리고 완료하는 데 3 초가 걸립니다. 레일 응용 프로그램은 API 서버 A를 호출이 대기 시간 동안

  2. 는, 밥은

는 루비 (1.9.3) 인터프리터가 API 서버 B로 요청을하는 요청 (또는 무언가를 만드는 Rails 3.x 프레임 워크에서) Bob의 요청을 차단하여 Alice의 요청이 완료 될 때까지 기다려야합니다.

+0

나는 비슷한 질문을하고있다. 그러나 나는 궁금한 점이있다. 당신의 레일 앱에서 activerecord를 통해 DB 쿼리를 만들지, 데이터가 순수하게 DB 쿼리를 작성한 백엔드 API 서버에서 유도되고 결과를 레일 프론트 엔드? –

+0

@BennyTjia 둘 다. 개별 요청은 로컬로 저장된 데이터와 API 서버가 반환 한 고유 데이터를 모두 사용합니다. – Matty

답변

7

단일 스레드, 이벤트가 발생하지 않은 서버 만 사용하거나 (이벤트가 발생한 서버에서 이벤트가 발생한 I/O를 사용하지 않는 경우) 예. 다른 솔루션 중 ThinEM-Synchrony을 사용하면이 문제를 방지 할 수 있습니다. 당신의 갱신에 따라

정교화는 :

아니, 루비 나 레일도 앱 차단이 발생할 것입니다. 당신은 웹 서버가 될 부분을 버렸습니다. 이벤트가 발생한 I/O 라이브러리와 함께 웹 서비스 요청을하는 것과 결합 된 다중 프로세스, 다중 스레드 또는 이벤트 서버가 필요합니다.

@alexd는 여러 프로세스를 사용하여 설명됩니다. 개인적으로, 내가 가진 많은 동시 요청 (또는 부하를 기반으로 프로세스를 가동시키는 무언가를 사용)을 사전에 알거나 추측 할 필요가 없으므로 이벤트 서버를 선호합니다. 단일 nginx 프로세스가 단일 thin 프로세스에 접하게됩니다. 병렬 요청 수를 서버 할 수 있습니다.

+1

그는 여전히 네트워크 대기 시간에 처하게됩니다. –

+3

_Network_ latency? 현재 사용자가 기다려야한다는 것을 의미한다면 당연히 그들은 기다릴 것입니다 (그러나 나는 그가 질문을 쓴 방식에서 추측합니다. 사용자가 외부 서비스를 때리는 대기 시간을 피하는 것이 아니라 다른 동시 요청을 차단하는 것에 관한 질문을 읽었습니다. – smparkes

+0

@smparkes이 질문에 대한 추가 설명을 추가했습니다 – Matty

0

대체로 그렇습니다. 이 주변에는 분명히 방법이 있지만 어느 것도 쉬운 것은 아닙니다.

더 나은 질문은 모든 요청에 ​​대해 왜 외부 API를 사용해야하는지입니다. Rails 애플리케이션과 외부 API 사이에 캐시 계층을 구현하고이를 대다수의 요청에 사용해야하는 이유는 무엇입니까?

캐시를 만료시키기위한 맞춤 로직을 사용하면 멋진 Rails 앱을 사용할 수 있으며 외부 API 서비스를 계속 활용할 수 있습니다.

+0

반환 된 데이터는 요청할 때마다 변경됩니다. 따라서 캐싱은 불가능합니다. – Matty

+0

그럼, 귀하의 API는 귀하의 데이터베이스라고 말하고 있습니까? 장기적으로는 실현 가능성이 없습니다. –

+0

API가 데이터베이스로 작동하지 않습니다. – Matty

3

질문에 대한 답변은 Rails 애플리케이션이 실행중인 서버에 따라 다릅니다. 지금 무엇을 사용하고 계십니까? 얇은? 일각수? 아파치 + 승객?

나는 당신의 상황에 대해 유니콘을 진심으로 추천한다 - 그것은 여러 서버 프로세스를 병렬로 실행하는 것을 매우 쉽게 만들어 주며 구성 파일의 번호를 변경함으로써 병렬 프로세스의 수를 간단히 구성 할 수있다. 하나의 유니콘 작업자가 앨리스의 대기 시간이 긴 요청을 처리하는 동안 다른 유니콘 작업자가 빈 CPU주기를 사용하여 밥의 요청을 처리 할 수 ​​있습니다.