2014-11-10 6 views
2

저는 Spring을 배우고 있습니다. 하나의 응용 컨텍스트에서 bean이 기본적으로 singleton이 될 것입니다.하지만 분산 시스템에 응용 프로그램을 배포하면 어떨까요? 요청이 들어올 때마다 싱글 톤을 구현하는 실제적인 방법은 무엇이겠습니까? 다른 응용 프로그램 컨텍스트가있는 다른 컴퓨터로 라우팅 될 수 있습니다.분산 환경에서 스프링 빈 싱글 톤을 만드는 방법은 무엇입니까?

나는 Singleton in Cluster environment을 읽었지만 대답은 캐시에 관한 것입니다.

우리는 (memcached와 같은) 중앙 위치에 싱글 톤을 넣는 것과 같은 작업을 할 수 있고,이 빈을 필요로하고 IO에서 직렬화 및 비 직렬화하는 것과 같은 작업을 할 수 있다고 생각합니다. 그러나 일부 의견은 전송하는 데 "비용이 많이 드는"것이므로 많은 비용이 소요될 것입니다.

감사합니다.

답변

0
  • 어느 당신의 싱글이 상태를 저장 : 다음 방금 필요한 노드 사이에 통신을 각 노드에서 같은 일을 다시 만들;

  • 또는 싱글 톤이 상태 저장 인 경우 : 상태를 배포해야합니다. 여기에 memcached 또는 다른 여러 가지 사용 가능한 분산 캐시를 적용해야합니다. 각 노드에서 단독으로 자체를 다시 생성하지만 내부 상태를 분산 캐시에 저장하게됩니다.

+0

그래서 글로벌 수준의 "Singlton"은 없지만 중앙의 "싱글 톤 상태"는 맞습니까? – Jaskey

+0

"싱글 톤 객체"의 개념은 분산 시스템에 적용될 때 상당히 다른 의미를 가짐을 이해해야합니다. Java 의미에서 더 이상 객체가 아닙니다. 오히려 객체가 클러스터 전체의 싱글 톤으로 보이도록 각 노드 내부에 프로그래밍 모델 *을 제시하는 완벽한 메커니즘입니다. 내부 메커니즘은 기본적으로 대답에서 설명하는 방식입니다. –

0

세션을 "고정"으로 설정할 수 있습니다. 요청이 특정 서버로 라우팅되면 해당 세션의 모든 요청이 동일한 서버로 이동합니다.

더 큰 질문은 다음과 같습니다. 분산 시스템을 이렇게 설계하고 구현하는 이유는 무엇입니까? 모든 사람을위한 싱글 톤은 확장 할 수 없습니다. 이 경로를 주장하면 아무 것도 클러스터링 할 수 없습니다.

더 나은 해결책은 상태 비 저장, 변경 불가능, 기능적입니다. 시스템을 모델링하는 stateless REST 서비스를 작성하십시오.

+0

흠 ... 나는 단일 노드 응용 프로그램에서 싱글 톤이 의미가 있으며, 클러스터 할 때이 싱글 톤은 여전히 ​​의미가 있어야한다고 생각하기 때문에 생각하지 않는다. (틀렸다면 정정 해주세요)? 그래서, 끈끈한 세션없이 분산 레벨에서 객체 싱글 톤을 유지하는 방법에 대한 질문이옵니다. 고맙습니다! – Jaskey

+0

싱글 노드 응용 프로그램에서 싱글 톤 (singletons)이 당연하다고 생각하는 이유는 무엇입니까? https://code.google.com/p/google-singleton-detector/ – duffymo

+0

글쎄, 그럼 왜 싱글 톤 패턴이 일반적인 패턴이고 스프링 빈은 싱글 톤인가? 싱글 톤이 의미가있는 어떤 이유가 있어야합니다, 그렇죠? – Jaskey

0

서비스와 마찬가지로 Singleton 인스턴스를 사용하고 전역 변수를 저장하지 않는다면 배포 할 필요가 없습니다.

경우에 따라 배포가 필요하므로 캐시 솔루션을 사용해야합니다. 최소의 비용으로 데이터를 저장할 수 있도록 구현을 최적화하려고 할 수도 있습니다.