2011-02-07 11 views
1

onApplicationStartを使用してアプリケーションをリセットし、クラスタ内のすべてのサーバがアプリケーションを再起動するようにする方法はありますか?ColdFusionクラスタでアプリケーションスコープをリセットする

たとえば、現在のコードでは、DSNが要求に設定されます。 私はそれをアプリケーションのスコープにプッシュしたいと思いますが、変更が必要な場合は、CFサービスを開始したり停止したりすることなく、クラスター内のすべてのサーバーに確実に伝播させたいと考えています。

答えて

4

1つの提案は、各サーバーが読み取ることができ、プロジェクトの日付スタンプ付きのファイルを持つことです。

CFは、起動時にアプリケーションに日付を保存し、それを各onRequestStartメソッドでそのファイルに対して持っているものを比較するには、Get()。

日付が変更された場合、CFはそのサーバーのonApplicationStart()を実行します。

我々は各サーバANTに展開ように私たちは、私たちのANTスクリプトでその技術を使用するには、ファイルにタイムスタンプを、私たちのアプリケーションをヒットする次の人は、アプリケーションのリセットが発生します。

乾杯、 ジェームズ

+1

リクエストごとに追加のcffileを読まなければならないというパフォーマンス上の問題はありますか? –

+0

それはアプローチに邪魔ですが、Javaに落としてjava.io.Fileを使用することで、問題を解決することができます。主な利点は、あまりにも多くの手間をかけずにシングル/クラスタ環境に適用できることです。URLの再初期化に頼る必要はなく、サーバーコードは実行中のサーバーに隔離されたままです。アドビは指摘する必要があり、クラスタコードの管理をもっと簡単にする必要があります。私が過去3回のバージョンで求めてきたのは、クラスタ全体でのアプリケーションスコープのサポートでした。それはすぐに起こって見ることができません:-( –

+0

あなたはonRequestEndも持っているので実際に考えていたので、リクエストが終了した後にファイルチェックを行うことができます。プロセスが始まる前に少なくとも結果は得られます。より効率的になるでしょう:-) –

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

ニースアプローチダン。 –

+0

サーバーがラウンドロビン方式の場合は、必ずしも機能しません。その設定セッションは、物事を管理する方法(つまり50%/ 50%)に応じて、特定のサーバーに割り当てられます。 –

+0

...これはすべてのクラスタ環境で動作し、すべてのサーバーが要求を受け取ることを保証できません。 HTTP上でsessionIDを使ってハッキングすることができます。各サーバーには固有のIDがありますので、特定のサーバーに要求を強制することができますが、一般的に、この方法は管理したり、どのように動作するかについて –

関連する問題