5

外部システムのイベントとタスクを、信頼できる/トランザクション的な方法でキューに入れる必要があります。MSMQ や ActiveMQ などの使用は非常に魅力的に見えますが、トランザクション部分は複雑になります (MSDTC など)。

データベース (SQL Server 2005 以降、Oracle 9 以降) を使用して、より簡単なトランザクション サポートを実現することもできますが、キューイング部分は見苦しくなります。

どちらのルートもそれほど素晴らしいようには見えず、厄介な落とし穴やエッジ ケースでいっぱいです。

誰かがこの問題について実用的なガイダンスを提供できますか?

考えてみてください: E/C/A またはスケジュールされたタスク エンジンが頻繁に起動し、現時点で実行する必要があるスケジュールされたタスクがあるかどうかを確認します (つまり、次の実行日は過ぎていますが、有効期限はまだ過ぎていません)。達した)。

4

6 に答える 6

5

私たちのシステムには 60 台のコンピューターがあり、それぞれが「次の仕事を得る」必要がある 12 のタスク (スレッド) を実行しています。全体として、1 日あたり 50K の「ジョブ」になります。1 分あたりのトランザクション数を計算し、タスク時間が可変であることを認識してください。そのため、まったく同時に複数の「ポップ」イベントを取得することが可能です。

MSMQ を使用した最初のバージョンがありました。結論:近づかないでください。ロードと同期の問題はうまくいきましたが、2 つの問題がありました。1つは迷惑で、1つは取引ブレーカーです。

煩わしい:エンタープライズ ソフトウェアとして、MSMQ にはセキュリティ ニーズがあり、セットアップして顧客のネットワーク管理者と戦うことがもう 1 つ必要になります。

ディールブレーカー:その後、次の仕事を取りたい時が来ましたが、単純なポップではなく、「次の青の仕事を得る」または「次の黄色の仕事を得る」のようなものを使用しました. できない!

計画 B: 単一の SQL 2005 テーブルを使用して独自の Q を実装しました。これ以上ないほど幸せ

1 日あたり 20 万件のメッセージでストレステストを行ったところ、うまくいきました。「次の」ロジックを必要なだけ複雑にすることができます。

問題点: 次の項目を受け取る SQL には十分注意する必要があります。高速で非ロックにしたいので。いくつかの調査に基づいて使用した非常に重要な SQLヒントが 2 つあります。魔法は次のようになります。

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy
于 2008-10-03T06:13:17.153 に答える
4

私は MSMQ がトランザクション的に使用されるのを見てきましたが、特に複雑ではないように思われました.Transaction SCOpe は、エンキューまたはデキューの呼び出しをデータベース アクセスと共にラップし、作成されたキューがトランザクションとして定義されている限り、すべて問題ありませんでした。これは、メッセージ ブローカーである ActiveMQ には当てはまらないと思いますが、MSMQ は各エンドポイント マシンにローカルにインストールされるため、項目をトランザクションでキューに入れるのに手の込んだ分散トランザクションは必要ありません。

おそらく既にご存じのことと思いますが、.NET には、MSMQ (および理論的には他のトランスポートも同様) に対して優れた抽象化を提供する軽量ライブラリがいくつかあります。

nServiceBus : www.nservicebus.com

公共交通機関 : http://code.google.com/p/masstransit/

また、Oren Eini は、実験的なファイル システム ベースのトランザクション キューを持っています。このライブラリの利点は、MSMQ とは異なり、ライブラリとして展開でき、MSMQ を展開するためのメンテナンスの手間がかからないことです。

ここでそれについて読むことができます: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

また、SQL Server 2005 は、SQL Server Service Broker を使用してキューイングをかなりエレガントに処理しますが、各エンドポイントに SQL Server をインストールする必要があり、SSB がファイアウォールを通過するかどうかはわかりません。

最後に、ここで探している答えが得られない場合は、nSErviceBus ディスカッション フォーラムを強くお勧めします。Udi Dahan は、彼の少数のメッセージ指向のフォロワーと共に、この種の質問に答えています。キュー指向の質問に迅速かつ適切に回答してもらうために、これまでに見つけた最高のリソースです。そのフォーラムはこちら: http://tech.groups.yahoo.com/group/nservicebus/

于 2008-10-03T06:11:25.863 に答える
1

Quartz.Netは、オープン ソースのジョブ スケジューリング システムです。

于 2008-10-03T05:52:15.830 に答える
1

これが、MSMQ が設計された目的であり、トランザクションのキューイングです。それがうまくいかない場合は、SQL Server の「サービス ブローカー」機能を確認してください。これは、「csmba」が彼の回答で説明している「SQL テーブルのキュー」ですが、統合された SQL Server コンポーネントであり、適切にパッケージ化されています。あなたの使用のために公開されます。

于 2008-10-03T07:40:27.740 に答える
0

WebSphere MQ (MQ シリーズ) はオプションですか? トランザクション メッセージングをサポートしています。

于 2008-10-03T05:52:18.950 に答える
0

Advanced Queuingという名前のOracle機能を見ることができます

于 2008-11-08T20:57:37.687 に答える