2011-02-07 2 views
1

onApplicationStart를 통해 응용 프로그램을 재설정하고 클러스터의 모든 서버가 응용 프로그램을 다시 시작하도록 할 수 있습니까?ColdFusion 클러스터의 응용 프로그램 범위 재설정

예를 들어, 현재 코드에서 DSN은 요청시 설정됩니다. 응용 프로그램 범위로 밀어 넣으 려하지만 변경해야 할 경우 CF 서비스를 시작하고 중지하지 않고 클러스터의 모든 서버로 전파되도록하고 싶습니다.

답변

4

한 가지 제안은 각 서버가 읽을 수있는 프로젝트의 날짜 스탬프 파일을 가지고하는 것입니다.

CF를 시작시 응용 프로그램에 저장하고 각 onRequestStart()에서 해당 파일과 비교합니다.

날짜가 변경되면 CF는 해당 서버의 onApplicationStart()를 실행합니다.

우리는이 기술을 ANT 스크립트와 함께 사용하므로 각 서버에 ANT가 파일을 타임 스탬프하고 우리의 응용 프로그램을 친 사람이 응용 프로그램을 재설정하게 만듭니다.

건배, 제임스

+1

모든 요청에 ​​대해 추가 cffile 읽기를 수행해야하는 데 따른 성능 문제가 있습니까? –

+0

그래, 그게 접근 방식의 단점이긴하지만, 자바로 떨어 뜨리고 java.io.File을 사용하면 문제를 해결할 수 있습니다.주된 이점은 많은 번거 로움없이 단일/클러스터 환경에이를 적용 할 수 있다는 것입니다. 다시 초기화하기 위해 URL 재 초기화에 의존 할 필요가 없으며 서버 코드가 서버를 실행중인 서버에 격리되어 있습니다. Adobe는 자신의 손가락을 뽑아 내고 클러스터 코드 관리를 훨씬 쉽게 할 필요가 있습니다. 지난 3 버전에서 내가 요청한 부분은 클러스터 전반에 걸쳐 애플리케이션 범위 지원이었습니다. 그것을 곧 볼 수 없습니다 :-( –

+0

그냥 실제로 - 당신은 onRequestEnd있어. 그래서 당신은 요청이 완료된 후 파일 검사를 할 수 있습니다. 적어도 사용자가 응용 프로그램을 다시로드하는 menas 최소한 프로세스가 시작되기 전에 결과를 얻습니다. 더 효율적 일 수 있습니다 :-) –

2

URL 변수를 통해 범위를 재설정하도록 애플리케이션을 설정했습니다. 그럼 당신은 관리자의 페이지를 통해 HTTP를 통해 클러스터의 모든 서버에서 응용 프로그램을 다시 시작하기 위해 다음과 같은 코드를 사용할 수 있습니다

<cfset serverList = "Server1.domain.com,Server2.domain.com" /> 
<cfset threadList = "" /> 
<cfloop list="#serverList#" index="currentServer"> 
    <cfset threadList = ListAppend(threadList, "thread#currentServer#") /> 
    <cfthread 
     action="run" 
     name="thread#currentServer#" 
     url="http://#currentServer#?URLToResetScope" 
     key="#currentIndex#" 
    > 
     <cfhttp method="get" url="#Attributes.URL#" result="thread.cfhttp" /> 
    </cfthread> 

</cfloop> 
<cfthread action="join" name="#threadList#" timeout="120000" /> 
<cfloop list="#threadList#" index="currentThread"> 
    <cfset Results &= currenthThread & ": " & threadresult.cfhttp /> 
</cfloop> 

우리가 그 목록을 통해 반복 한 후, 서버 목록을 복용하고있는 , cfthread를 사용하여 각 서버에 요청을 전달하여 자신의 범위를 재설정합니다. 그런 다음 모든 스레드를 함께 결합하고 루프를 통해 각 요청의 결과를 얻습니다. 그런 다음 결과를 관리자에게 표시하여 클러스터의 모든 서버가 올바르게 업데이트되었는지 확인할 수 있습니다. 에 올바르게 업데이트되지 않은 서버가 있으면 해당 서버를 개별적으로 재설정 할 수 있습니다.

+0

멋진 접근 Dan. –

+0

서버가 라운드 로빈 일 경우 반드시 작동하지 않습니다. 이 설정 세션은 사물을 관리하는 방법 (예 : 50 %/50 %)에 따라 특정 서버에 할당됩니다. –

+0

...이 방법이 모든 클러스터 환경에서 작동하고 모든 서버가 요청할 것이라고 보장 할 수는 없습니다. HTTP에서 sessionID로 약간의 해킹을 할 수 있으며 각 서버는 고유 한 ID를 가지므로 특정 서버로 요청을 보낼 수 있지만 일반적으로이 방법은 관리하고 "규칙을 굽히거나" 어떻게 일을해야하는지. –