0

変更を加えることができないレガシー システムが多数ありますが、これらのシステムからデータの変更を取得し、他のシステムに自動的に適用したいと考えています。

何らかの形式のサービス バス (特定の技術はまだ選択されていません) を中間に配置し、一連のバス アダプター (レガシー アプリケーションごとに 1 つ) を使用して、データベース固有の概念と一般的な更新メッセージを変換することを考えています。

私が注目している領域の 1 つは、変更データ キャプチャ (CDC) を使用してレガシー データベースの更新アクティビティを監視し、その情報を使用して適切なメッセージを作成することです。ただし、CDC 情報の消費者として、アプリケーションによって適用された変更と、メッセージの受信時にバス アダプターによって適用された変更を区別するにはどうすればよいかという懸念があります。そうしないと、バスによって配布される最初の更新がその変更を自分のシステムに適用すると、すべての受信者によって再配布されます。

「貧乏人」CDC、つまりトリガーを実装していた場合、それらのトリガーは元の DML ステートメントのコンテキスト/トランザクション/接続内で実行されるため、特定の 1 人のユーザー (バスからの着信更新を適用するユーザー) を無視するように設計できます。 )、または特定の更新を同様に無視するようにセッションプロパティを設定および検出します。

何か案は?

4

1 に答える 1

2

私があなたの質問を正しく理解している場合、あなたは既に選択した設計 (エンタープライズ サービス バスを使用)で機能するメッセージ ルーティング構造と、レガシー システムからデータを流すために使用できるメッセージ実装を定義しようとしています。ポートの変更のみを新しいシステムに転送します。

問題は、レガシー システムからデータ バンドルを受信するクライアントから CDC メッセージを生成しないように変更を適用しようとすることです。実際、あなたが心配しているのは、新しいシステムがデータを消費し、メッセージをバスに戻さないようにすることです。これにより、指数関数的に増大する可能性のある不要なクロストークが発生し、インフラストラクチャが過負荷になります。

その秘密は、MSSQL の CDC 機能がネットワークを介して伝播する変更を調整する方法にあります。具体的には、次の注意事項に注意してください。

すべての変更は、LSN またはログ シーケンス番号で記録されます。SQL は、ログ シーケンス番号によって DML の各操作を明確に識別します。テーブルでコミットされたすべての変更は、SQL Server によって提供される特定の LSN を使用して、データベースのトランザクション ログに記録されます。__$operationcolumn の値は、1 = 削除、2 = 挿入、3 = 更新 (更新前の値)、4 = 更新 (更新後の値) です。

cdc.fn_cdc_get_net_changes_dbo_Employee は、関数で指定した LSN の間に収まる正味変更されたすべてのレコードを提供します。net_change 関数によって 3 つのレコードが返されます。削除、挿入、および 2 つの更新がありましたが、同じレコードでした。更新されたレコードの場合、両方の更新が完了した後の正味の変更値のみが表示されます。

すべての変更を取得するには、cdc.fn_cdc_get_all_changes_dbo_Employee; を実行します。「ALL」または「ALL UPDATE OLD」を渡すオプションがあります。「ALL」オプションはすべての変更を提供しますが、更新の場合は更新後の値を提供します。したがって、更新用の 2 つのレコードが見つかります。Jason が Nichole に更新されたときの最初の更新を示す 1 つのレコードと、Nichole が EMMA に更新されたときの 1 つのレコードがあります。

このドキュメントはやや簡潔で理解しにくいものですが、変更はログに記録され、LSN の順序で調整されているようです。競合する変更このシステムによって破棄され、一貫性モデルが効果的に機能するようになります。

次の点にも注意してください。

CDC はデフォルトで無効になっているため、データベース レベルで有効にしてから、テーブルで有効にする必要があります。

次に、オプション B が明らかになります。レガシー システムに CDC を導入し、サービス バスを使用して、これらの変更を CDC にバインドされていない更新に変換します (たとえば、生のトランザクション更新ステートメントを使用します)。これにより、システムの設計から求められる一方向のデータ フローが可能になります。

変更を調整するその他の方法については、ウィキペディアの記事「結果整合性」で提起された概念を検討してください。内部データベース メッセージング システムの幸運を祈ります。

于 2012-03-29T21:30:30.227 に答える