13

2 ~ 4 台のサーバー環境で組み込みのサーバー フェールオーバーを使用する TIBCO EMS ソリューションがあります。TIBCO 管理者がある EMS サーバーから別の EMS サーバーにサービスをフェールオーバーする場合、接続は EMS サービス レベルで新しいサーバーに自動的に転送されるはずです。EMS サービスを使用する C# アプリケーションでは、これは発生しません。フェールオーバー後にユーザー接続が新しいサーバーに転送されず、その理由がわかりません。

EMS へのアプリケーション接続は起動時のみであるため、ユーザーがアプリケーションを起動した後に TIBCO 管理者がフェイルオーバーした場合、ユーザーは新しいサーバーに再接続するためにアプリを再起動する必要があります (EMS 接続では、4 つの実稼働 EMS サーバーすべてを含むサーバー文字列を使用します)。 - 最初の試行が失敗した場合、文字列内の次のサーバーに移動して再試行します)。

接続が切れていることが検出された場合に定期的に EMS への再接続を試みる自動化されたアプローチを探していますが、それを行う最善の方法がわかりません。

何か案は?TIBCO.EMS.dll バージョン 4.4.2 および .Net 2.x (SmartClient アプリ) を使用しています。

どんな助けでも大歓迎です。

4

3 に答える 3

8

まず、はい、私は自分の質問に答えています。ただし、アジマストリアンがなければ、私はどこにもいないことに注意することが重要です。どうもありがとうございます!

ONE: ConnectionFactory.SetReconnAttemptCount、SetReconnAttemptDelay、SetReconnAttemptTimeout を適切に設定する必要があります。デフォルト値では再試行が速すぎると思います (再試行の間に 1/2 秒程度)。当社の EMS サーバーは、ネットワーク ストレージなどが原因で、フェイルオーバーに時間がかかることがあります。そのため、1/2 秒間隔で 5 回の再試行では十分な長さではありません。

2: クライアント-サーバーおよびサーバー-クライアントのハートビートを有効にすることが重要だと考えています。確認できませんでしたが、それらが配置されていないと、サーバーがオフラインであるか、フェールオーバー モードに切り替わっているという通知をクライアントが受け取れない可能性があります。もちろん、これは EMS のサーバー側の設定です。

THREE: Tibems.SetExceptionOnFTSwitch(true); を設定することでフェイルオーバー イベントを監視できます。次に、例外イベント ハンドラを接続します。単一サーバー環境では、「接続が終了しました」というメッセージが表示されます。ただし、フォールト トレラントなマルチサーバー環境にいる場合は、次のように表示されます。この通知は厳密には必要ありませんが、役立つ場合があります (特にテストの場合)。

4: EMS のドキュメントでは明らかではありませんが、接続の再接続は単一サーバー環境では機能しません。マルチサーバーの耐障害性環境にいる必要があります。ただし、トリックがあります。同じサーバーを接続リストに 2 回入れることができます - 奇妙なことですが、それは機能し、組み込みの再接続ロジックが機能するようになります。

いくつかのコード:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}
于 2008-10-24T19:31:10.720 に答える
6

この投稿は、私の現在のコメントを要約し、私のアプローチをより詳細に説明する必要があります...

TIBCO の「ConnectionFactory」および「Connection」タイプは、重量のあるスレッドセーフなタイプです。TIBCO は、1 つの ConnectionFactory (サーバー構成ファクトリーごと) と、ファクトリーごとに 1 つの Connection の使用を維持することをお勧めます

サーバーは、インプレースの「接続」フェイルオーバーと再接続も担当しているように見えるので、サーバーがその仕事をしていることを確認してから、その機能に頼りましょう.

クライアント側のソリューションを作成することは、サーバーまたはクライアントのセットアップの問題を修正することよりも少し複雑になります。失敗した接続から作成したすべてのセッションを再作成する必要があります (プロデューサー、コンシューマー、宛先は言うまでもありません)。どちらのタイプにも「再接続」または「リフレッシュ」メソッドはありません。セッションは、親接続への参照も維持しません。

接続/セッション オブジェクトのルックアップを管理し、全員を再初期化する必要があります。または、新しい接続を取得して再接続できる、ある種のセッション失敗イベント ハンドラーを実装します。

そのため、とりあえず、クライアントがフェイルオーバー通知を受信するように設定されているかどうかを調べてみましょう (tib ems ユーザー ガイド pg 292)。また、発生した例外がキャッチされ、フェイルオーバー URL が含まれ、適切に処理されていることを確認してください。

于 2008-10-16T21:19:00.443 に答える
1

クライアント アプリケーションは、tibco.tibjms.ft.switch.exception システム プロパティを設定することにより、フェイルオーバーの通知を受け取ることができます。

おそらく、ライブラリはそれを機能させる必要がありますか?

于 2008-10-16T21:04:39.677 に答える