私はJavaで金融アプリケーションに取り組んでおり、並行性を正しく取得するのは苦痛です。Erlangとアクターモデルは大規模な並行アプリケーションに適しているはずですが、Javaでそれを行う方法がわかりません。Jetlang、FunctionalJava、kilimなどのライブラリがあることは知っていますが、それらは通常、単純な例を超えるものではありません。
市場データフィード、注文/取引フィードからいくつかの数値を計算し、このデータの派生物を「出力」するなど、3つまたは4つの異なるイベントを処理する必要があるとします。ほとんどの場合、これらのイベントまたはデータストリームは順番に処理する必要があります(少なくともいくつかのキーに関しては...たとえば、特定のシンボルのすべての順序を順番に処理する必要がありますが、並行して処理する必要があります)無関係な記号に関して)
状態を変更するメソッドを使用して、通常のJavaオブジェクトを作成します。これらのメソッドに直接状態を変更させるのではなく、パラメーターを(コマンドオブジェクトに変換して)fifoキュー(erlangのメールボックス)と、そのキューを処理するreact()メソッドに配置します。このように、すべての更新は単一のキューを通過する必要があり、react()メソッドは一度に1つの更新にのみアクセスできます。理論的には、これにより、このメソッドをロックまたは同期する必要がなくなります。
ただし、このキューは基本的にプロデューサー/コンシューマーキューであり、ブロッキングキューであることを意味します。ブロッキングはスケーラビリティにとって非常に悪いです。また、単一のキューがあるということは、(異なるタイプの)すべての更新コマンドオブジェクトが(Objectのような)過度に一般的なスーパータイプでキューから出てくることを意味し、それらを正しいタイプにキャストして、react()に処理させる必要があります。
このアクター化されたオブジェクトが出力を生成し、別のそのようなオブジェクトによって消費されると、私は同じプロセスを実行します。言い換えれば、プログラミングモデルを、結果を返すメソッドを使用するオブジェクト指向から、すべてのメソッドが非同期になる悪夢を渡すある種の継続に変更しました。
これにどのようにアプローチできるかについてのアイデアはありますか?