5

一部のビジネス ロジック タスクにはステートフルな DataSnap サーバーを使用し、クライアント データセット データを提供します。

ビジネス ルールを変更するためにサーバーを更新する必要がある場合は、新しいバージョンを新しい空のフォルダにコピーして登録します (Delphi のバージョンに応じて、TRegSvr ユーティリティを起動または実行するだけです)。

これは、古いサーバー インスタンスの実行中でも実行できます。ただし、新しいバージョンを登録した後は、すべての新しいクライアント接続で、現在実行中の (古い) サーバー インスタンスが引き続き使用されます。最初にすべてのクライアントを切断する必要があります。その後、新しいサーバーが次のクライアントに使用されます。

登録直後に、すべての新しいクライアント接続を新しいサーバーに転送する方法はありますか?

(新しいまたは変更されたメソッド署名にはクライアントの変更と再起動も必要であることは知っていますが、この質問はインターフェイスに影響を与えない内部変更に関するものです)

ソケット接続を使用しており、すべてのクライアントが同じサーバー アプリケーションを共有しています (1 つのアプリケーション ウィンドウのみが開いています)。初期の頃は、クライアントごとに 1 つのアプリ ウィンドウになるリモート データ モジュールの別の構成を使用していました。多分これは解決策になるでしょうか?(すべての新しいクライアントが現在登録されている実行可能ファイルを起動するため)

更新: Delphi XE は、(更新されたサーバーの) 「ホット デプロイメント」をサポートしていますか? 現在、Delphi 2009 を使用していますが、「ホット デプロイメント」の実装がより簡単であれば、XE にアップグレードします。

4

6 に答える 6

6

appserver を 2 つの新しいサーバーに分けることができます。1 つは単純なプロキシ オブジェクトで、すべてのメソッドをリダイレクトし (オプションで状態情報があればそれを含みます)、もう 1 つは実際にビジネス ロジックを実装しています。また、いつでもビジネス アプリケーション サーバーを置き換えることにした場合に、接続されているクライアントを妨害しないように、プロキシ サーバー内に「サイレント再接続」機能を実装する必要があります。自分でそのようなデザインをしたことはありませんが、アイデアが明確であることを願っています

于 2009-06-09T06:23:05.757 に答える
1

この質問に対する簡単な答えはおそらくないでしょう、そして私はあなたがクライアントを修正しなければならないだろうと思います。私が考えることができる最も簡単な解決策は、クライアントが切断して再接続するように指示するフラグ(一般的に呼ばれるメソッドのプロパティまたはoutパラメーター)をサーバーに設定することです(ImBeingRetiredのようなものと呼ばれます)。

datasnapの特定の状況下でコールバックを作成することも可能です(私はこれを行ったことがありませんが)。これにより、サーバーはクライアントに再起動または再接続する必要があることを通知できます。

私が考えることができる最後のオプション(まだ言及されていません)は、クライアント/サーバーをステートレスにすることです。これにより、クライアントが接続するものを必要とするたびに、必要なものを取得してから切断します。

残念ながら、これらのオプションはどれもあなたがあなたの質問に望む答えではありませんが、あなたにいくつかのアイデアを与えるかもしれません。

于 2009-06-11T04:17:04.023 に答える
1

現在のサーバーの名前を変更し、新しいサーバーを同じ場所に正しい名前で配置しようとしましたか (レジストリの場所を変更するのではなく)。以前にCOMライブラリに対してこれを行って成功しました。完全に新しいサーバーではなく、アタッチする既存のインスタンスを探す可能性があるため、リモート起動ルールに適用されるかどうかはわかりません.

少しハックかもしれませんが、クライアントにサーバー上のメソッドを呼び出して、新しいバージョンが利用可能であることを示します。これにより、必要なクリーンアップを実行できるため、既存のサーバー インスタンスと新しいサーバー インスタンスの両方と同時に通信することはありません。

于 2009-06-04T11:58:48.370 に答える
0

新しいバージョン (Delphi 2010 以降) には、興味深い解決策があります。

  • HTTP トランスポートを使用するシステムの場合:

Andreano Lanusse による DataSnap 2010 でのフェールオーバーと負荷分散の実装

  • TCP/IP トランスポートに関する関連する質問:

DataSnap クライアント接続をさまざまな DS サーバーに転送する方法は?

于 2012-08-06T16:05:18.273 に答える
0

「データバージョン」を保持する特定のテーブルを作成することで、同様のことを行いました。サーバーを更新したり、システム全体のグローバル設定を変更したりするたびに、このフィールドをインクリメントします。クライアントが起動すると、常にこの値がチェックされ、トランザクション/クエリの前に再度チェックされます。最初に開始したときと値が異なる場合は、再初期化ロジックを実行する必要がありました。これには、更新されたサーバーへの再ログインが簡単に含まれる可能性があります。

IIS を使用してアプリ サーバーを公開していたので、変更されるデータはアプリ サーバーへのパスになります。進行中の既存のトランザクションに対応するために、古いものを利用できるようにしました。最終的に、そのバージョンへのクライアント接続がなくなったことがわかったら、これらは削除されます。

クライアントが最後に接続したサーバーもログに記録すれば、どのバージョンを維持するかを簡単に知ることができます(したがって、知っているはずです)。

于 2010-10-25T16:07:07.403 に答える
0
  1. (オプション) vmware vSphere、ESX をセットアップするか、既に存在するホスティング サービスを見つけます。
  2. セッション変数を db に保存します。
  3. 2 つの異なる IP アドレスを持つ 2 つの Web ボックスを準備し、独自のものを展開します。
  4. 名前「example.com」が Web ボックス 1 に解決されるように、DNS、ファイアウォール、ロード バランサ、または BSD vm を設定します。
  5. 新しいバージョンを Web ボックス 2 にデプロイします。
  6. 選択したルーティング方法を使用して、Web ボックス 2 に切り替えます。
  7. 問題がなければ、新しいバージョンを Web ボックス 1 にデプロイします。

DNS を使用するのがおそらく最も簡単ですが、マッピングがクライアントに伝播するのに時間がかかり (クライアントが LAN 外にある場合)、2 つのクライアントで異なる結果が表示される場合もあります。一部のファイアウォールには、パブリック IP アドレスと内部 IP アドレスをマッピングできる IP アドレス マッピング機能があります。ロードバランサーを使って50:50に設定し、アップグレードしたいときに100:0に変更するのが理想的ですが、費用がかかります。より安価な代替手段は、BSD vm でソフトウェア ロード バランサを実行することですが、おそらく多少の作業が必要です。

編集:私が言いたかったのは、セッションではなくセッション変数です。サーバーはステートフルだと言いました。セッション変数を使用するビジネス ロジックが含まれている場合は、切り替え時に再接続しても保持されるように、外部に保存する必要があります。実際の DataSnap セッションが失われるため、アップグレード中に Web ボックス 1 をシャットダウンすると、クライアントは Web ボックス 1 によって「セッション {some-uuid} が見つかりません」というエラーを受け取り、Web ボックス 2 に再接続します。 3 つの IP アドレス (1 つのパブリックと 2 つのプライベート) を使用して、クライアントが常に 1 つのアドレスを認識するようにします。これはより適切な方法です。

于 2009-06-07T16:18:08.817 に答える