2009-07-26 3 views
10

Google App Engine (또는 분산 서버 환경)에서 싱글 톤이 작동하는 방식에 흥미가 있습니다. 애플리케이션이 여러 프로세스 (여러 시스템)에서 동시에 실행될 수 있고 요청이 모든 장소에서 전달 될 수 있다고 가정하면 애플리케이션이 'CacheManager.getInstance()'와 같은 작업을 수행 할 때 실제적으로 어떤 일이 발생합니까?Google App Engine (또는보다 일반적으로 분산 서버 환경)에서 싱글 톤은 어떻게 작동합니까?

예를 들어 (GAE) CacheManager를 사용하고 있지만, 요점은 어딘가에 싱글 톤의 단일 글로벌 응용 프로그램 인스턴스가 있으므로 어디에서 살 것인가? RPC가 호출 되었습니까? 사실, 세션과 같은 글로벌 애플리케이션 상태는 실제로 일반적으로 어떻게 처리됩니까?

감사합니다, 쉐인

답변

12

App Engine Java의 싱글 톤은 웹 애플리케이션 단위가 아니라 런타임 단위입니다. 그들의 목적은 기본 서비스 (Memcache와 Users API의 경우 모두 RPC를 통해 액세스되는)에 대한 단일 액세스 지점을 제공하는 것입니다.하지만 이것은 순수하게 라이브러리의 디자인 패턴입니다. 앱 별 싱글 톤이 없습니다. 이러한 메소드가 액세스하는 곳이면 어디에서나 사용할 수 있습니다.

+0

이것은 이것이 작동 할 것이라고 예측 한 방법입니다. 건배. :) – Shane

3

캐시는 일반적으로 분산 복제 캐시의 일종와 연결되어 있습니다. 예를 들어 GAE는 memcached의 사용자 지정 버전을 사용하여 저장소 상태를 일관된 상태로 유지하면서 클러스터에서 개체의 공유 캐시 유지 관리를 처리합니다. 일반적으로 성능 및 캐시 일관성 측면에서 여러 가지 다른 절충안을 사용하여이 문제에 대한 솔루션이 많이 있습니다 (예 : 모든 캐시가 100 % 일치하는 것이 중요합니다. 캐시를 디스크에 기록하여 보호해야합니다. 손실 등). 여기

은 (분산 캐싱 기능을 일부 샘플 제품 대부분이 훌륭한 세부 사항에서 다양한 접근 방법의 장단점을 설명하는 문서 :

당신이 볼 수 있듯이,이 문제에 접근 한 많은 프로젝트가 있었다. 한 가지 가능한 솔루션은 단일 시스템에서 단일 캐시를 공유하는 것입니다. 그러나 대부분의 프로젝트는 일종의 복제 및 분산 장애 조치를 가능하게합니다.

+0

캐시 예제를 이용해 주셔서 감사합니다. 그러나 캐시를 웹 개발 싱글 톤 사용의 예제로 사용하고 있습니다. 나는 쉽게 사용자 싱글 톤이 될 수 있었다. 위의 대답에서 말한 것처럼 요청/응답 단계 후에도 지속되는 일부 싱글 톤 객체에 대한 생각은 혼란 스럽습니다. 요구 사항을 견딜 수 있다고 가정 할 수는 없다는 것을 이해하고 있습니다. 그래서 싱글 톤이 실제로 무엇을 의미하는지, 분산 웹 환경에서 정확히 무엇을하는지 이해하려고합니다. 한편, 나는 당신이 준 캐시 예제 코드를 연구하여 그들이하는 일을 살펴볼 것이다. – Shane

+0

이 질문에 대한 답변이 하나도 없기 때문에 캐싱 예제를 제공했습니다. 만약 당신이 싱글 톤을 VM (또는 심지어 요청 당) 단위로 원한다면, 그것을 전혀 배포하지 않을 것입니다. 반면에 여러 VM과 요청에 걸쳐 싱글 톤을 공유하려는 경우 일종의 캐싱 솔루션을 사용하게됩니다. 세션 처리에서도 마찬가지입니다. 나는 당신이 말하는 "Singletons"가 실제로 공유 리소스를 얻기 위해 클라이언트에 액세스하는 데 사용되는 VM 당 (아마도 요청 당) 싱글 톤이라고 의심합니다. – jsight

0

GAE의 특성에 대해서는 잘 모르겠지만 일반적으로이 크기의 웹 응용 프로그램에서는 다수의 프로세스가 여러 시스템에서 실행되고 이들 프로세스간에 부하가 분산됩니다. 각 프로세스 내에서 멀티 스레드 웹 서버를 사용하는 경우 여러 요청을 처리 할 수 ​​있습니다. 따라서 동일한 웹 서버 내 요청 (예 : 웹 애플리케이션 프로세스가 시작될 때 인스턴스화하는 싱글 톤)간에 객체를 공유 할 수 있습니다.

웹 서버가 멀티 스레드가 아니라 다중 프로세스 인 경우 별도의 캐싱 프로세스와 대화하지 않고 원하는만큼 요청간에 개체를 공유 할 수 없습니다.

GAE 문서는 본질적으로 동일한 작업을 수행 할 수있는 "App Caching"을 지원하는 것으로 보입니다. 그러나 문서에서 멀티 스레드 웹을 사용하여이 작업을 수행하는지 여부는 분명하지 않습니다. 서버 또는 웹 서버와 함께 실행중인 다른 캐싱 프로세스에 대해 설명합니다.

CacheManager.getInstance()항상이 동일한 객체로 해석되는지 또는 동일한 웹 서버에서 처리되는 요청이 동일한 객체인지 만 알고 싶습니다. 실제로, 그것은 단지 memcached 프로세스와 별도로 대화하는 데 사용되기 때문에 중요하지 않습니다.

+0

싱글 톤의 본질은 동일한 객체 인스턴스로 해결되어야한다는 것을 의미한다고 생각했을 것입니다. 요청할 때, 필자는 글자 그대로 프로세스 친 화성을 기대하지 않으며, 특히 Google App Engine과 관련이 있습니다. 하나의 요청이 호주로 가고 다음은 미국으로 가기를 기대합니다. 따라서 그 근거로 신뢰할 수있는 사례에 대해 생각할 수있는 유일한 방법은 객체를 추출하는 일종의 중앙 제어기에 대한 RPC입니다. 그것은 내게 반 스케일 된 것처럼 보입니다. Memcache 예제는 여러 데이터 센터에 분산 된 클라우드 환경에서 까다로운 사례입니다. – Shane