私たちの組織では、SQL Server 2005 データベースとかなりの数のデータベース クライアント (Web サイト (php、zope、asp.net)、リッチ クライアント (レガシー fox pro)) を使用しています。ここで、コア データベースから特定のイベントを他のシステム (MongoDb、LDAP など) に渡す必要があります。メッセージング パラダイムは、この種の問題をかなり解決できるようです。そこで、RabbitMQ ブローカーをミドルウェアとして使用することにしました。
データベースからイベントを消費するという問題には、最初は 2 つの解決策しかないように思われました。
- 送信メッセージについてデータベースをポーリングし、それらをメッセージ ブローカーに渡します。
- 特定のテーブルでトリガーを使用して、同じマシン上のブローカーにメッセージを渡します。
最初のアイデアは、SQL の定期的な実行が関係している場合に発生する遅延の問題のために嫌いでした。
しかし、イベントベースのトリガーアプローチには、現時点では解決できないように見える問題があります。次のシナリオを検討してください。
- テーブルに行が挿入されます。
- トリガーが起動してメッセージを送信する (C# で記述された CLR ストアド プロシージャを使用)
データを書き込むトランザクションがロールバックされない限り、すべて問題ありません。この場合、データは一貫していますが、トランザクションのコミット時ではなく、データベース ログへの書き込み時にトリガーが起動するため、メッセージは既に送信されており、ロールバックできません (これは RDBMS の正しい動作です)。 .
あまりにも多くのトリガーを要求していて、データを操作する以外のタスクには適していないことに気付きました。
だから私の質問は:
- トリガーを使用してデータイベントを抽出できた人はいますか?
- データ イベントを使用するその他の方法としてアドバイスできるものはありますか?
- クエリ通知 (Service Broker の上に構築) は私の状況に適していますか?
前もって感謝します!