3

Erlang Interoperability guide では、さまざまな相互運用メカニズムについて説明しています。ここに私の結論があります:

  • Ports および Erl_Interface プログラム: OS によってスケジュールされ、スケーラビリティが制限されます。

  • ポート ドライバー: ポート ドライバーがクラッシュするとエミュレーターもダウンするため、危険です。

  • C ノード: ノード サーバーは、スケーラビリティの犠牲を避けるために、Erlang アプリと同様にスケーリングする必要があります。

  • NIF: Loicはそれらをうまくまとめています。

ErlangエミュレーターにCPUを所有させながら、基本的にリソースを大量に消費する計算をGPUに委譲するOpenCLの使用を支持する人もいます。これは素晴らしいことのように思えますが、サーバーに適切な GPU を搭載する必要があります。

JInterface を使用し、すべての要求に対してスレッドを生成する Java プロセスと通信することは、オプションかもしれません。

それでは、実際にテストされ、うまく機能することが判明したソリューションに出くわした人はいますか?

4

1 に答える 1

3

実際、すべてのソリューションが発生します。私は彼らの何人かと緊密に協力してきたので、次のように言うことができます:

  • ポートは安全ですが、ポート通信は低速です。ポートがクラッシュしても、VM は引き続き機能します。ポートと広範囲に通信しない場合、またはポートを信頼していない場合 - これはあなたの選択です

  • NIF は非常に高速です。データフローが優れている場合は、それらを使用する必要があります。もちろん、それらは安全ではないので、NIF ライブラリを慎重にプログラムする必要があり、C をいくつか学ぶ必要があります (ほとんどの NIF 作成者がスキップするポイント)。実際、スケジューリングの問題は、特定のパターンで簡単に克服できます。Erlang からデータを受信した直後に、実際のジョブを実行する新しい C スレッドを開始し、Erlang スレッドから処理を分離する必要があります。したがって、NIF 関数をすぐに終了して Erlang に戻り、C コードからのメッセージを待ちます。

  • Java ノードまたは C ノードは、ノードに完全に移動できるタスク用です。それはいくつかの長くて重い仕事です。

上記の考慮事項を念頭に置いて、タスクに最適な方法を決定してください。

于 2015-09-29T18:25:01.530 に答える