これは実際にはDrools自体とは関係ないかもしれませんが、おそらくJavaのネイティブソリューションを持っている可能性があります。私はちょうど完全なJavaのnoobであり、プロジェクトを継承しているので、ベストプラクティスを理解しようとしています。JBoss Drools KieBaseコレクションを外部ストレージ用にシリアル化するにはどうすればよいですか?
私たちには、クライアントがビジネスルールを動的に設定できるルールベースのマルチテナントシステムがあります。私たちは、string
がそれぞれ独自のクライアントを表すUUIDあるこの
ConcurrentMap<String, KieBase> rules = new ConcurrentHashMap<>();
のように見えますConcurrentHashMap
に各クライアントのコンパイル済みのルールを格納します。しかし、この問題は、計算を水平方向にスケーリングすることが問題になります。これは、メモリハッシュマップ内で各変更ごとに再コンパイルされるためです。私たちがそれをスケールアウトした場合、すべてのクライアントは新しいルールの変更を聞いて、それが起こるたびにいつでも再コンパイルする必要があります。
私の最終目標は、複数のインスタンスがコンパイルされたルールを共有することができるようにJVMの外でこれらの計算のルールを格納することで、他のすべてのインスタンスことかもしれないが、それらのインスタンスのいずれかが安全に、同時に特定のクライアントのためのルールを再コンパイルすることができクライアントは、だから私の考えは鍵がclient_idのだろうと値はDroolsのKieBaseオブジェクトの直列化されたバージョンになりAK/Vロック/ストアとしてのRedisを使用していた
を待つだろうとのルールを必要とします。再計算ではtransaction(またはそれに類するロックアルゴリズム)を使用してそのキーにredisストアをロックするので、そのclient_idのKieBaseを必要とする他のインスタンスはコンパイルが完了してdbに書き戻されるまで待機します。
だから私はいくつかの質問を持っている:
- は、この連載は、Droolsの特定のものをオブジェクトKieBaseまたは任意のオブジェクトのためのJavaでの一般的なマーシャリングの直列化メカニズムがあるです(?これは推奨されます)
- reddissonのようなものは、私が探しているものとまったく同じですか?もしそうなら、誰かが正しい方向に私を向けるスニペットを持っていますか?私は基本的に各クライアントの鍵をロックする必要があります。そのため、複数のインスタンスがブロックされている間にブロックされますが、ハッシュマップの1つのエントリだけをロックすることは望ましくありません。
ありがとうございました。上記の最終目標を明確にしました。これは複数の実行中のJavaプロセス間でこのハッシュマップを共有する "依存"シナリオで_former_を実行することです。私はByteArrayのものを調べますが、それは私に良いスタートを与えます。私は、Jedisを使ってそのByteArrayをRedisに直接格納できるようです。ロックについては、私はRedisトランザクションで逃げることができないのか、Redissonのようなより高度なアルゴリズムが必要なのかどうかはわかりません。 – brad
適切なDBには書き込みロック機構があります。また、あなたの場合には、MS WindowsおよびすべてのUnicesで利用可能な簡単なファイルストレージとファイルロックで管理することさえ可能かもしれません。 – laune
私はDBへのパブリックインターフェイスが必要なので、私は水平方向に拡大縮小できます。私は最終的に私がレディソンがおそらく私が望むことをするだろうと分かったと思います。分散された並行性の問題を扱い、オブジェクトを再帰的にシリアル化することができます – brad