web-dev-qa-db-ja.com

この場合、メッセージキューフレームワークを使用する価値はありますか?

特定の時間に実行される「実行」と呼ばれるものがあります。彼らは基本的に「delayマイクロ秒後に実行してください」と言うdelayプロパティを持っています。現在、キューとしてCassandraを使用していますが、これは間違いなくスケーラブルではありません、そしてデータベースはキューに最適なツールではありません。

これを優先キューとして実装することもできますが、大量のメッセージを受信することが予想されるため、これをメモリに保持できません。優先度をサポートするApacheのActiveMQを使用することを考えていましたが、フレームワーク全体を導入する価値があるかどうか疑問に思っています。私の他のオプションは、ディスクに書き込まれる優先キューを実装することです(MappedByteBufferを使用)。 2番目のオプションはより多くの作業ですが、より直接的にユースケースに対応します。私はActiveMQを使用してもかまいませんが、間違いなく簡単ですが、フレームワーク全体を取り込む価値があるのは、その一部しか使用しない場合に限られます。

もう少しコンテキスト:

さまざまなソースからデータを取り込むこれらのスクリプトがあります。スクリプトは、「delayマイクロ秒後に再度実行する」(基本的に新しいデータをポーリングする)と言う「実行」オブジェクトとともにデータを返します。現在、この実行はCassandraに書き込まれており、スレッドは定期的にこれらをポーリングして取得し、適切なスクリプトを呼び出します。

メッセージキューについて詳しく読むと、それが機能しないことさえあります。 ActiveMQには優先順位の固定リストがありますが、任意の優先順位値をサポートする優先順位キューが必要です。

それは多かれ少なかれスケジューラーだと思います。各実行はdelayマイクロ秒後に実行されるように「スケジュール」されています。ここでスケジューリングフレームワークを使用する方が適切でしょうか?優先順位をサポートするものはありますか?

3
Vivin Paliath

あなたが本当に何を考えるする必要があるジョブを実行するためにメモリに保持する;それは、ジョブID、次の実行時間、および定期的な繰り返し時間と同じくらい単純な場合があります。最も単純な(そしておそらく単純化し過ぎた)ケースでは、すべてがデータベースにとどまることができ、実行「エンジン」は実行する次のジョブを知っていればよいだけです。

プロファイルを作成し、可能性のあるピーク負荷を考慮して、必要に応じて作業エージェント、ディスパッチャー、およびキュー(oh my!)を追加します。または完全に異なるもの;)

1
Steven A. Lowe

私が理解しているように、あなたは次のことをする必要があります:

  1. スクリプトを実行する
  2. データを取得し、優先順位を付けてdelayの後に次のスクリプトの実行をスケジュールします

Quartzのようないくつかのスケジューリングフレームワークを使用して、ステップ2を実装します。 Quartzは、同時にトリガーされた場合に実行を優先する機能を提供します。

Trigger trigger = newTrigger() 
    .withIdentity(triggerKey("myTrigger", "myTriggerGroup"))
    .startAt(futureDate(delay, SECONDS))
    .withPriority(priority)
    .build();

完全な例は Quartzチュートリアル にあります。

このアプローチでは、追加のデータベーステーブルは必要ありません。永続性が必要な場合は、JDBC JobStore構成を使用して、スケジューリングデータをデータベースに保存できます。

1
Dawid Pytel