ルール (contains、memberof で使用) の LHS でコレクションを使用する方法を知りたいです。これは、要素の大きなリスト (数万になる可能性があります) を含む Guvnor で管理できます。例としてブラックリストの一致を取り上げます。どうすれば、guvnor で大きなブラックリストを非常に効率的に維持できますか? 何か案は?
2 に答える
モデルは次のようなものです。
declare MyItem
end
と
declare MyList extends ArrayList
end
フィールドの数式を使用する必要があります。リストをクリックしてから、新しい式をクリックして書き込みます
this contains myItem
または memberOf を使用する場合。ここでも MyItem に数式を使用します
this memberOf myList
ブラックリストの各項目を作業メモリに挿入するだけです。これは、memberOf または contains を使用するよりも効率的です。また、Guvnor を使用してルールを簡単に記述できるようにもなります。リストに文字列が含まれている場合、これを行うことができます:
declared ListItem
name:String
end
Drools を使用して、リストからルールを挿入できます (Java コードでルールを実行する前にこれを行うこともできます)。
rule "Just to empty the list"
when
list:List()
then
for(String name:list)
insert(Item(name));
end
これで、ブラック リスト アイテムに対するルールを作成できます。
まず、アプリケーション設計の最適化を開始する前に、これをテストすることをお勧めします。それは完全に問題ではないかもしれません!
ただし、巨大なブラックリストがある場合、それを作業メモリに挿入するのは時間がかかる可能性があります。ファクトの挿入により、Rete ネットワークを介して伝播されます。そのコンテンツに依存するルールの数によっては、処理が遅くなる可能性があります。Rete ネットワークが更新されると、その後の評価は迅速に行われます。
したがって、ルール/セッションの動作方法によっては、パフォーマンスを最適化するための 1 つの手法として、実行時間の長いセッションを作成し、起動時にブラックリストを挿入することができます。これにより、「リクエスト」ファクトを挿入し、何が発生するかを確認してからリクエストを取り消すことができるため、作業メモリは次のリクエストに備えることができます。
残念ながら、これは他のいくつかの問題を引き起こします。たとえば、ルールによっては、セッションへのアクセスを共有するのではなく、同期する必要がある場合があります。これにより、応答は高速ですが、互いに終了するまで待機する必要があり、スケーラビリティの問題になる可能性があります。それが問題になる場合は、セッションのプールを作成して、複数のユーザーによる同時クエリをサポートできます。