5

私はある学区で働いており、Drools を使用して、学区を構成する学校の生徒数に対して次のタイプのルールを実装することを計画しています。

  • 学生が 1 年間に 3 回欠席した場合、出席指標は WARN ステータスに移行します。
  • 学生が 1 年間に 6 回欠席した場合、出席指標はクリティカル ステータスに移行します。
  • 学生が 1 年間に 3 つの重大な行動インシデントを起こした場合、その学生の行動指標は WARN ステータスに移行します。
  • 学生が 1 年に 2 回のマイナーな行動インシデントと 2 つの重大な行動インシデントを起こした場合、その行動指標はクリティカル ステータスに移行します。
  • …これらは頭の中で思いついた例にすぎませんが、似たような性質のルールは他にもたくさんあります。

これらのルールはすべて、Drools エキスパートを使用して簡単に表現できます。また、生徒のルールの処理は同期である必要はありません。これを実装する最良の方法についていくつか質問があります。

  1. ある観点からは、これは一連のイベントの監視システムと見なすことができます。これにより、新しい各イベントが挿入されるステートフル セッションを作成することを考えました。ただし、イベントは 9 か月にわたって発生し、比較的まれです。また、学校ごと、または生徒ごとにセッションを構築することもできます。

    • その長い間セッションをメモリに保持することは問題でしょうか?
    • サーバーに障害が発生した場合、セッション状態を最初から再構築する必要がありますか、それとも定期的にスナップショットを作成し、スナップショットの時点以降に発生した事実を復元することをお勧めします.
  2. もう 1 つのオプションは、その学生のイベントが処理された後、各学生のセッションを永続化することです。次のイベントが発生すると、ストレージからセッションを取得し、新しいファクトを挿入します。こうすれば、学生のステータスを取得するために、エンジンを実行するたびにすべてのファクトを取得する必要がなくなります。このような構成はサポートされますか? これを行うことに短所はありますか?

  3. 3 番目のアプローチは、ルールを実行する必要がある他のすべての事実を取得し、新しい KnowledgeSession を作成してルールを実行することにより、学生の新しい事実に対応することです。

何が最善のアプローチであるかについてのアドバイスは大歓迎です。

デイブ

4

4 に答える 4

3

私は解決策 2 を採用します。生徒 1 人につき 1 つのセッションです。セッションとあまりやり取りしないという事実を考えると、私はそれをデータベースに保持し、必要な場合にのみ復元します。新しい欠席/インシデントが到着すると、その学生のセッションがデータベースから復元され、事実挿入されると、ルールが実行され、結果のステータスが取得されます。

このシナリオの主な欠点は、複数の学生に関するルールを作成するのは簡単ではなく、事実を複数のセッションに提供する必要があることです。たとえば、1 つのクラスに CRITICAL ステータスの生徒が 10 人以上いる場合にアラートを発生させたい場合などです。この場合、クラスごとのセッションで十分です。したがって、ご覧のとおり、自分にとって何が良いかを判断する必要があります。ただし、選択した「ユニット」(学校、クラス、学生)に関係なく、前述の実行フローをお勧めします.

Drools には、JPA を使用したデータベースの永続性がすでにサポートされています。この機能の詳細については、http: //docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e3961を参照してください。

基本的な考え方は、 を使用して ksession を作成する代わりに、kbase.newStatefulKnowledgeSession()と呼ばれるヘルパー クラスを使用することですJPAKnowledgeServiceStatefulKnowledgeSessionこのクラスは、各メソッドの呼び出し後にその状態を維持するのラッパーを返します。このクラスには、2 つの重要なメソッドがあります。newStatefulKnowledgeSession()新しい ksession を作成loadStatefulKnowledgeSession()し、データベースから既存のセッションを取得します。

それが役に立てば幸い、

于 2013-02-13T08:52:34.730 に答える
1

メンテナンスを簡単にする 4 番目のオプションがあります。すべての生徒のために、学区全体で 1 つのステートフルなナレッジ セッションを構築します。各イベントが正常に処理された後、JVM 障害の場合に作業メモリを再構築する必要がある場合に備えて、セッションを永続化します。より大きな RAM とヒープ領域の割り当てが必要になりますが、今日では RAM は安価です。(私たちは 32 GB の RAM を使用し、16 GB の XM と Xmx を割り当てます) 24 時間年中無休のサーバーを使用していれば、JVM がダウンすることはほとんどありません。

于 2013-06-06T17:00:40.903 に答える
0

怠け者なので、3番目のアプローチに行きます。すべてのイベントを DB に保存します。次に、すべての学生を 1 日、1 週間、1 か月 (必要に応じて) に 1 回バッチで処理します。これにより、複数の学生、クラスなどをカバーするルールを使用して、1 つのセッションのみを作成できます。300 万人以上の学生がいない場合でも問題なく、パフォーマンスの高いアプリになります。

于 2013-02-13T12:09:24.967 に答える
0

提案とアドバイスをありがとう。私はいくつかの理由で #2 に傾いています。

  • 特定の生徒のためにすべての事実を収集して、イベントが発生するたびにそれらをゼロから再実行することは、私がむしろ避けたい重いプロセスになると思います。
  • 私がモデルを非常に長時間実行する監視プロセスとして扱っているユースケースは、(Fusion のユースケースを読んだ後) 永続的な KnowledgeSession にイベントを挿入することが道であると私に信じさせます。
  • 問題空間の範囲 (つまり、生徒対教室、学校、または学区全体) は問題ではないと思います。教室の指標が必要な場合は、関連するイベント (テスト、欠席など) も消費するクラス用の新しいルールベースが必要です。

1 つの注意点は、ルールが変更された場合、影響を受けるすべての生徒を新しいルールベースに対して再評価する必要があるということです。これは、すべての事実を収集し、学年の初めから開始することを意味します。これはあまり発生しないはずですが、より頻繁になる場合は、3 番目のアプローチに移行する可能性があります。

助けてくれてありがとう。

于 2013-02-13T17:05:34.060 に答える