2009-07-28 10 views
42

싱글 톤 개체를 클러스터 환경에 리팩터링하는 최선의 전략은 무엇입니까?클러스터 환경의 싱글 톤

우리는 데이터베이스에서 사용자 정의 정보를 캐시하기 위해 싱글 톤을 사용합니다. 해당 은 대부분 읽기 전용이지만 특정 이벤트가 발생할 때 새로 고침됩니다.

이제 응용 프로그램을 클러스터 된 환경에 배포해야합니다. 정의에 따라 각 JVM에는 자체 Singleton 인스턴스가 있습니다. 따라서 단일 노드에서 새로 고치기 이벤트가 발생하고 캐시가 새로 고쳐질 때 캐시가 JVM과 동기화되지 않을 수 있습니다.

캐시를 동기화 상태로 유지하는 가장 좋은 방법은 무엇입니까?

감사합니다.

편집 : 캐시는 주로 UI에 자동 완성 목록 (성능상의 이유)을 제공하는 데 사용되며 우리는 Websphere를 사용합니다. 그래서 어떤 Websphere 관련 팁도 환영합니다.

답변

9

가장 간단한 방법은 다음과 같습니다 모든 너무 자주 캐시를 제거하고 subsquent됩니다 호출 소스에서 업데이트 된 데이터를 가져올 수 있도록

  1. 이 단일 캐시에 만료 타이머를 추가 (예를 들어,데이터베이스)

  2. JMS 주제/tibRV와 같은 것을 사용하여 캐시에 대한 통지 메커니즘을 구현하십시오. 각 캐시 인스턴스를 가져 와서이 주제에 관한 모든 변경 메시지를 구독하고 이에 대응하십시오.

+0

당신은 2에 대해 자세히 설명 할 수 있습니까? 당신은 JMS pub/subscribe 모델을 의미합니까? – lud0h

+0

예 솔루션 2는 본질적으로 개별 캐시 인스턴스에 대한 변경을 브로드 캐스팅하기 위해 pub/sub 메커니즘을 사용하는 방법입니다. 각 캐시가 구독하는 응용 프로그램 서버에서 실행되는 JMS 항목을 만들어야합니다. 해당 데이터가 변경되면 메시지를 해당 주제에 게시해야합니다. 그러면 각 구독자는이 메시지를 수신하고 이에 따라 로컬 캐시를 업데이트합니다. – pjp

+0

데이터가 자주 변경되지 않으면 옵션 1을 사용합니다.이 방법을 사용하여 참조 데이터를 새로 고치는 여러 시스템에서 작업했습니다. 나는 우리가 매 30 분마다 캐시를 ​​새로 고쳐야한다고 생각한다. 선택한 새로 고침 기간은 참조 데이터가 사용되는 방식을 기반으로합니다. – pjp

16

싱글 톤 캐시를 분산 캐시로 바꿉니다.

이러한 캐시 중 하나는 JBoss Infinispan 일 수 있지만 다른 분산 캐시 및 그리드 기술이 존재할 것으로 확신합니다. 현재 상업용 캐시와 그리드 기술은 현재 더 성숙한 상태입니다.

일반적으로 싱글 톤 개체의 경우 확실하지 않습니다. 처음에는 싱글 톤을 갖지 않으려 고합니다.

+0

나는 가장 간단한 것 (주관적으로) 구현하는 것이 'ehcache'인 것으로 나타났습니다. –

1

가능하면 가능하면 앱 서버의 지원을 사용하십시오 (일부는 지원하고 일부 지원하지는 않음). 예를 들어, JBoss는 클러스터 마스터 노드에서만 실행되는 서비스 인 "HA Singleton"을 지원합니다. 완벽하지는 않습니다 (때로는 두뇌가 방귀를 뀌는 경우를 처리해야합니다).하지만 충분합니다.

그렇지 않으면 클러스터 노드 자동 검색 및 협상 기능을 제공하는 JGroups를 사용하여 무언가를 제작할 수 있지만 그다지 중요하지는 않습니다.

최후의 수단으로 클러스터 싱글 톤을 관리하기 위해 데이터베이스 잠금을 사용할 수 있지만, 심각하게는입니다. 권장하지 않습니다.

클러스터 싱글 톤 대신에 분산 캐시를 사용할 수 있습니다. 나는 JBossCache (JBoss 응용 프로그램 서버를 실행할 필요가 없음) 또는 EhCache (현재 배포 메커니즘 제공)를 권장합니다. 분산 된 방식으로 작동하도록 캐시를 리엔지니어링해야합니다 (마술처럼 작동하지는 않지만).하지만 클러스터 싱글 톤보다 더 나은 솔루션이 될 것입니다.

1

저는이 사건에 대한 Mr. Vest Hansen과 함께 할 수있는 한 싱글 톤에서 멀리 이동합니다. SAAJ와 JAXP라는 악몽에 빠져서 JBoss에서 작동하는 호환 버전을 얻은 후에는 싱글 톤과 팩토리를 사용했습니다. SOAP 메시지는 인스턴스를 생성하기위한 팩토리가 필요하지 않습니다.

좋아요, 울부 짖었다, memcache 또는 그와 비슷한 것은 어떨까요? 어떤 종류의 친 화성이 캐시에 필요합니까? 시대에 뒤 떨어진 것이라면 좋지 않습니까, 아니면 데이터가 오래 가지 못하는지 어느 정도 융통성이 있습니까?

+0

자동 완성 목록에 사용하므로 사용자가 변경 사항을 볼 수 없습니다. 귀하의 의견을 Thx. – lud0h

4

또는

memcached를

http://www.danga.com/memcached/

같은 어떤 memcached를한다? memcached는 고성능, 분산 메모리 개체 캐싱 시스템, 일반 에 일반이지만 데이터베이스 부하를 완화하여 동적 웹 응용 프로그램 의 속도를 높이기 위해 사용합니다.

Danga 인터랙티브 의 속도 LiveJournal.com, 였다 사이트 이미 에 100 만 사용자를 위해 2,000 만 + 동적 페이지를 웹 서버의 무리와 데이터베이스의 무리를 하루 전망을 수행을 향상시키기 위해 을 memcached를 개발 한 서버. memcached는 데이터베이스로드가 거의 없음으로, 사용자의 페이지로드 시간이 더 단축되고 리소스 사용률이 더 높아졌습니다 ( ). memcache 누락시 데이터베이스에 더 빨리 액세스 할 수 있습니다.

1

1) 데이터의 데이터 부족, 2) 모든 인스턴스가 항상 동일한 값을 가져야하는지 여부에 따라 여러 가지 방법으로 처리 할 수 ​​있습니다.

합리적으로 데이터까지는 데이터가 필요하지만 모든 JVM에는 일치하는 데이터가 필요하지 않은 경우 모든 jvm에서 동일한 일정 (예 : 30 초마다)의 데이터를 새로 고칠 수 있습니다. 모든 JVM이 항상 동일한 정보를 필요로하는 경우

새로 고침에 대해 동시에 발생해야하는 경우

, 당신이 말하는 그들의 나머지에 메시지를 보내

를 "지금 새로 고침의 시간을"하나의 JVM을 가질 수 있습니다 마스터가 "새로 고침"이라고 말한 동기화를 수행해야합니다. 모든 캐시가 새로운 쿼리를 차단하고, 새로 고치고, 완료되었음을 마스터에게 알립니다. 마스터가 클러스터의 모든 구성원으로부터 응답을 받으면 진행하라는 다른 메시지를 보냅니다.

+0

모든 인스턴스에 일부 데이터가 필요합니다. 그렇지 않으면 사용자가 새로운 변경 사항을 볼 수 없습니다. JVM을 동기화 상태로 유지하는 데 좀 더 자세히 설명 할 수 있습니까? 어떤 종류의 하위/알림을 사용할 수 있습니까? 고마워. – lud0h

+1

^모든 인스턴스에 약간의 데이터가 필요합니다.^-> 모든 인스턴스에 * 동일한 * 데이터가 필요합니다. – lud0h

+0

1, 새로 고치기 위해 다른 JVM에 어떻게 말하고 있는지 설명해주십시오. pub/sub 접근법을 사용하고 있습니까? 2, 지연없이 업데이트 된 데이터가 필요할 경우에는 어떻게해야합니까? 즉, JVM1의 1 개의 thread가 데이터를 갱신하고있어, 다음의 분 JVM2가 그 데이터를 필요로하는 경우. 이 상황을 어떻게 처리 할 것인가. –

0

이 상황에서 도움이 될 메모리 캐시 (예 : memcache)가있는 제품이 있습니다.

가능하면 더 나은 해결책은 싱글 톤이 실제로 단일이 아니지만 애플리케이션이 별도의 인스턴스를 허용하는 것입니다 (모두가 새로 고쳐야 할 때를 인식한다고 말하면서). 캐시를 병목 현상으로 만들 수있는 JVM간에 동기화

+0

그래, 트릭 부분은 "모두 새로 고쳐야 할 때 인식합니다"... JMS는 메시징 공급자를 필요로합니다. RMI가 유일한 옵션 일 수 있습니다. 다른 아이디어? (jGroups/Terracota는 제외) 등등. 외부 종속성없이? – lud0h

8

WAS에 내장 된 DistributedMap을 사용할 수 있습니다.

-Rick

+0

링크를 제공해 주셔서 감사합니다. JMS보다 설정하고 사용하는 것이 훨씬 간단 해 보입니다. – lud0h

+0

링크가 죽은 것 같습니다 ... –

1

나는 비슷한 상황에 직면하고있어,하지만 난 오라클의 웹 로직일관성을 사용하고 있습니다.

나는 데이터베이스에서 읽어 캐시 된 데이터와 함께 해시 맵을 사용하는 웹 응용 프로그램을 통해 일하고 있어요 (텍스트 웹 양식의 라벨에 표시 할). 이를 위해 개발자는이 모든 정보를 저장 한 싱글 톤 인스턴스를 사용했습니다. 이것은 단일 서버 환경에서 잘 작동했지만 지금은 클러스터 솔루션에 들어가기를 원하며이 싱글 톤 인스턴스로이 문제에 직면하고 있습니다.

내가 지금까지 읽은 것부터 this is the best solution to accomplish what I want. 이 문제가 당신을 도울 수 있기를 바랍니다.

+0

위의 링크가 작동하지 않습니다. 이 개념을 공유해주십시오. –