문제

나는 REST API를 모으고 있으며 그것이 어떻게 확장 될지 또는 수요가 무엇인지 확실하지 않기 때문에 제한된 사용을 평가하고 일시적으로 요청을 거부 할 수 있기를 원합니다. 상자는 용량이 지나거나 일종의 슬래시 팅 시나리오가있는 경우.

또한 더 많은 용량을 추가하여 서비스를 확장 해야하는 경우 (기본 서비스가 약간 오프라인 상태임을 나타내는 클라이언트의 결과를 제공하는 동안) 서비스를 일시적으로 중단 할 수 있기를 원합니다.

이런 종류의 모범 사례가 있습니까? 구현은 MySQL과 함께 Rails입니다.

도움이 되었습니까?

해결책

이것은 모두 외부 웹 서버로 이루어지며, 이는 세계에 듣는다 (나는 nginx 또는 lighttpd를 권장한다).

속도 제한과 관련하여 Nginx는 각 IP 당 50 개의 REQ/분을 제한 할 수 있으며, 503 페이지를 얻을 수 있습니다.

예상 임시 다운과 관련하여, 철도 세계에서 이것은 특수 유지 관리를 통해 이루어집니다. html 페이지. Rails 앱 서버가 다운 될 때 해당 파일을 생성하거나 Symlink를 생성하는 일종의 자동화가 있습니다. 파일 존재가 아니라 앱 서버의 실제 가용성에 의존하는 것이 좋습니다.

그러나 실제로 연결을 잃지 않고 서비스를 시작/중지 할 수 있습니다. 즉, 다른 UNIX 소켓/IP 포트에서 별도의 앱 서버 인스턴스를 실행할 수 있으며 밸런서 (nginx/lighty/haproxy)에 해당 새 인스턴스를 사용하십시오. 그런 다음 오래된 인스턴스를 종료하고 모든 클라이언트는 새로운 인스턴스 만 제공됩니다. 연결이 없어졌습니다. 물론이 시나리오는 항상 가능한 것은 아니며 새 버전으로 소개 한 변경 유형에 따라 다릅니다.

Haproxy는 밸런서 전용 솔루션입니다. 농장의 앱 서버에 대한 요청을 매우 효율적으로 균형을 맞출 수 있습니다.

상당히 큰 서비스를 위해 : 당신은 다음과 같은 것들로 끝납니다.

  • API. 도메인은 라운드 로빈 N 밸런서로 해결됩니다
  • 각 밸런서 프록시는 동적 컨텐츠에 대한 정적 및 P 앱 서버에 대한 M 웹 서버에게 요청합니다. 오, 당신의 REST API는 정적 파일이 없습니다.

상당히 작은 서비스 (2K RPS 미만)의 경우 모든 밸런싱은 1-2 웹 서버 내에서 수행됩니다.

다른 팁

이미 좋은 답변 - 리미터를 직접 구현하고 싶지 않다면 3Scale과 같은 솔루션도 있습니다 (http://www.3scale.net) API의 속도 제한, 분석 등을 수행합니다. 플러그인을 사용하여 작동합니다 (여기 참조 루비 API 플러그인) 3 스케일 아키텍처에 연결됩니다. 바니시를 통해 사용할 수 있으며 바니시 작용은 속도 제한 대리로 작용할 수 있습니다.

그렇지 않으면 트래픽이 높으면 여전히 앱을 죽이는 효과가 있기 때문에 응용 프로그램 이외의 속도 제한을 구현하는 것이 좋습니다. 좋은 솔루션 중 하나는 Apache 프록시의 일부로 구현하는 것입니다. mod_evasive

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