20

私の現在の開発プロジェクトには 2 つの側面があります。まず、外部ユーザーがさまざまな目的で情報を送信および更新できる公開 Web サイトがあります。この情報は、コロ施設のローカル SQL Server に保存されます。

2 番目の側面は、従業員が同じレコードを (概念的に) 管理し、ステータスの更新、承認などを提供するために使用する内部アプリケーションです。このアプリケーションは、独自のローカル SQL Server データベースを使用して、企業のファイアウォール内でホストされます。

2 つのネットワークはハードウェア VPN ソリューションによって接続されています。これはまともですが、明らかに世界で最も高速なものではありません.

2 つのデータベースは類似しており、同じテーブルの多くを共有していますが、100% 同じではありません。両側のテーブルの多くは、内部または外部アプリケーションに非常に固有のものです。

問題は、ユーザーが自分の情報を更新したり、公開 Web サイトで記録を送信したりするとき、そのデータを内部アプリケーションのデータベースに転送して、内部スタッフが管理できるようにするにはどうすればよいかということです。またその逆も同様です... スタッフが行った更新を Web サイトに戻すにはどうすればよいですか?

これらの更新がより「リアルタイム」に行われるほど、より良いことに言及する価値があります。すぐに実行する必要はありませんが、適度に高速です。

これまでのところ、次のタイプのアプローチを使用することを考えてきました。

  1. 双方向レプリケーション
  2. 変更が行われたときに (リアルタイムで) 同期するためのコードを含む、両側の Web サービス インターフェイス。
  3. 変更を非同期的に同期するためのコードを含む両側の Web サービス インターフェイス (キューイング メカニズムを使用)。

何かアドバイス?以前にこの問題に遭遇した人はいますか? あなたにとってうまくいく解決策を思いつきましたか?

4

5 に答える 5

22

これはかなり一般的な統合シナリオだと思います。個人的には、キューを使用した非同期メッセージング ソリューションが理想的だと思います。

レプリケーションなどのオーバーヘッドや複雑さなしに、ほぼリアルタイムの同期を実現できるはずです。

同期 Web サービスは、障害シナリオを処理するために非常に洗練されたコードを作成する必要があるため、理想的ではありません。一方のシステムが再起動され、もう一方のシステムが変更を公開し続けるとどうなりますか? 送信側システムはタイムアウトしますか? それはそれらで何をしますか?データを失う覚悟がない限り、何らかのトランザクション キュー (MSMQ など) で変更通知を受信し、それらが他のシステムに確実に到達するように処理する必要があります。いずれかのシステムがダウンした場合、変更 (メッセージとして渡される) が蓄積され、接続が確立されるとすぐに、再起動中のサーバーがキューに入れられたすべてのメッセージを処理して追いつくため、システムの整合性をはるかに簡単に実現できます。

.NET を使用している場合 (特に MSMQ を使用する場合)、これを簡単に実行できるオープン ソース ツールがいくつかあります。

  1. Udi DahanによるnServiceBus
  2. Dru Sellers と Chris Patterson によるMass Transit

商用製品もあります。商用オプションを検討している場合は、.NET のオプションの一覧についてはこちらを参照してください。もちろん、WCF は MSMQ バインディングを使用して非同期メッセージングを行うことができますが、nServiceBus や MassTransit などのツールを使用すると、非常に単純な送受信または Pub/Sub API が提供され、要件が非常に簡単になります。

Java を使用している場合、Mule や ActiveMQ など、この種の双方向の非同期メッセージングを簡単にするオープン ソース サービス バスの実装がいくつもあります。

また、 Udi Dahanのブログを読んだり、彼のポッドキャストを聞いたりすることも検討してください。開始するためのその他の優れたリソースを次に示します。

于 2008-08-17T03:22:49.017 に答える
3

低速接続 (場合によってはダイヤルアップ) で同期を維持する必要がある複数のサイトがあることを除いて、同様のプロジェクトの途中です。

最初に、変更を追跡する必要があります。SQL 2008 を使用できる場合 (2Gb の制限が問題にならない場合は、Express バージョンでも十分です)、データベースと各テーブルで変更追跡を有効にするだけで、問題が大幅に軽減されます。本社では SQL Server 2008 を拡張スキーマで使用し、各サイトでは SQL Express 2008 を使用してデータのサブセットと限定されたスキーマを使用しています。

次に、変更を追跡する必要があります。Sync Servicesはこのトリックをうまく実行し、メイン データベースへの WCF ゲートウェイの使用をサポートします。この例では、 Sync using SQL Express Client を使用する必要があります。出発点としてのサンプルですが、これは SQL 2005 に基づいているため、2008 の変更追跡機能を利用するには更新する必要があることに注意してください。デフォルトでは、Sync Services はクライアントで SQL CE を使用します。あなたの場合は十分ではありません。Synchronize() メソッドを定期的に (必要に応じて 10 秒ごとに) 実行する Web サーバー上で実行されるサービスが必要です。これにより、メインデータベースにローカルで行われた変更が通知され、そこで行われたすべての変更についてサーバーに問い合わせます。get および apply SQL コードをセットアップしてストアド プロシージャを呼び出し、イベント ハンドラーを追加して競合 (クライアント更新とサーバー更新など) を処理し、それぞれの端で適切に解決できます。

于 2008-09-17T01:53:31.300 に答える
1

最近、私は SQL Server Service Broker で多くの成功を収めました。SQL Server Service Broker は、実装の手間がほとんどなく、すぐに使用できる信頼性の高い持続的な非同期メッセージングを提供します。

  • セットアップは簡単で、学習が進むにつれて、より高度な機能を使用できるようになります。
  • ほとんどの人には知られていませんが、デスクトップ版にも含まれているため、ワークステーションのメッセージング システムとして使用できます。
  • メッセージを読み書きするすべてのコードは SQL で実行されるため、既存の T-SQL スキルがある場合はそれらを活用できます。
  • 目もくらむほど速い

これは、SQL Server の過小評価されている部分であり、一見の価値があります。

于 2008-09-02T08:20:54.087 に答える
1

クライアントとしてショップがあり、3 つのストアが同じ VPN に接続されています
。2 つのショップには、そのショップの「サーバー」として実行されているコンピューターがあり、3 番目のショップには「マスター データベース」があります。
すべてをマスターに同期するために、私たちは最善の解決策はありませんが、機能します。2 つのストアのすべてのテーブルのすべてのレコードのタイムスタンプをチェックするアプリケーションを実行する専用の PC があり、最後に同期したときと異なる場合は、結果をコピーします
これは両方の方法で機能することに注意してください。つまり、マスター データベースの商品を更新すると、この変更が他の 2 つのショップに反映されます。いずれかのショップで新規注文があると、「マスター」に送信されます。

于 2008-08-21T11:52:50.507 に答える
0

pub データベースの入力テーブルのデータをプライベート データベースの保留中のテーブルにコピーするジョブがあると思います。次に、プライベート側のデータを更新したら、それをパブリック側に複製します。公開側でレプリケートされたデータが更新されていない場合は、かなり簡単なトランザクション レプリケーション ソリューションになるはずです。

于 2008-08-17T04:07:34.323 に答える