2011-08-15 5 views
0

파일 (PDF 파일의 이미지 페이지)의 아티팩트를 처리하는 응용 프로그램이 있고 원본 PDF 파일이 S3에 저장되어 서버에 다운로드됩니다 클라이언트가 이미지를 생성 할 때 이미지를 생성합니다. 이 컴퓨터에는 각 PDF 파일을 한 번만 다운로드하는 로컬 캐싱 메커니즘이 있습니다.특정 리소스 경로를 기반으로 가능한로드 균형 조정을 수행하는 방법

따라서 고객이 요청할 때 pdf 123.pdf 페이지 1을 제공합니다.이 캐시가 체크되어 있고 거기에 pdf 파일이 없다면 S3에서 다운로드되어 로컬 캐시에 저장되고 프로세스는이 페이지 1을 생성하고 이미지를 클라이언트에 다시 보냅니다.

클라이언트 자체는 특수 서버에 연결되어 있다는 것을 모릅니다. 웹 서버에 액세스하는 것처럼 보이지만, 성능 향상을 위해이 클라이언트가 항상 대상으로 지정됩니다. 첫 번째 요청을 처리 한 동일한 파일 서버 (S3에서 파일을 다운로드 함)

나는 특정 파일 서버에서 항상 다운로드하도록 클라이언트에 쿠키를 설정할 수 있지만 클라이언트에 배치하면 부적절한 사용으로 이어질 수 있습니다. 일부 사용자는 많은 문서를 열고 일부는 그렇지 않기 때문입니다. 리소스 수준 (PDF 문서)에서이로드 균형 조정을 수행하고 싶습니다.

각 문서에는 고유 한 ID (데이터베이스의 정수 기본 키)가 있으며 첫 번째 솔루션은 Redis를 사용하고 문서 ID를 키로 저장했으며 값은 현재 캐시 된이 문서가있는 서버 컴퓨터의 호스트입니다. 하지만 Redis를 제거하거나 다른 곳에서 키를 찾을 필요가없는 간단한 구현 방법을 찾고 싶습니다.

또한 정의 된 알고리즘이나 아이디어로 더 많은 파일 서버를 추가 할 수 있다면 좋을 것입니다.

자원을 기준으로 한 유사성으로 이러한 종류의로드 균형 조정을 수행하는 가장 좋은 방법은 무엇입니까?

단지이 응용 프로그램은 Ruby, java 및 Scala가 혼합 된 것입니다.

답변

2

나는 부하 분산에 다음과 같은 방법을 사용할 것 :

  • 스트립

    요청 된 자원의 URL 쿼리 및 단편 부분을 제거 할 수 있습니다.
  • 제거 된 URL을 String으로 변환하고 해시 코드를 가져옵니다.
  • 해시 코드를 사용하여 사용 가능한 서버 목록에서 백 엔드 서버를 선택합니다. 예 :

    String[] serverNames = ... 
    String serverName = serverNames[hash % serverNames.length]; 
    

이 모든 서버에 걸쳐 균등하게 부하를 확산하고, 항상 같은 서버에 같은 요청을 보냅니다. 더 많은 서버를 추가하면 캐시가 자동으로 조정되지만 캐싱이 다시 워밍업되는 동안 성능이 저하됩니다.

"공정성"을 목표로하고 싶지 않습니다. 즉, 각 요청에 대략 동일한 시간이 걸리는 보증이 있습니다. 공정성을 달성하려면 각 백엔드의로드를 능동적으로 모니터링하고로드에 따라 파견해야합니다. 캐싱/선호도를 (다소) 무효화 할 것이고 측정 및로드 밸런싱 의사 결정을 수행하는 데 리소스를 소비하게 될 것입니다. 멍청한 부하 분산 접근법 (예 : 제안)은 사용 사례 전반에 걸쳐 전반적인 처리량을 향상시켜야합니다.

관련 문제