質問

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

データベース(SQL Server 2005 +、Oracle 9+)を使用してトランザクションサポートを簡単に実現できますが、キューイング部分がtheいものになります。

どちらのルートもそれほど素晴らしいとは思えず、厄介な落とし穴やエッジケースで満たされています。

この件に関して誰かが実用的なガイダンスを提供できますか?

考える:E / C / Aまたは定期的に起動するスケジュールされたタスクエンジンは、この時点で実行する必要があるスケジュールされたタスクがあるかどうかを確認します(つまり、next-run-dateは過ぎましたが、expiration-dateはあります)まだ到達していません)。

役に立ちましたか?

解決

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

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

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

Deal Breaker:次の仕事をしたい時が来ましたが、シンプルなポップではなく、「次の青ジョブを取得」のようなものを使用しました。または「次の黄色のジョブを取得」。できません!

プラン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

他のヒント

MSMQがトランザクションで使用されるのを見たことがあり、特に複雑に思えませんでした-トランザクションスコープは、データベースアクセスとともにエンキューまたはデキューコールをラップし、作成されたキューがトランザクションとして定義されている限りすべて正常でした。これはメッセージブローカーである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/

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top