5

お互いに話したいソフトウェア コンポーネントが 2 つあります。

  1. node.js Web アプリケーション
  2. C で記述された専用サーバー (他の言語ではラップしたくないあいまいなライブラリを処理するかなり単純なコード)

私がしたい会話はとてもシンプルで、

  • ノード: セットアップ リソース ID A
  • C アプリ: OK、これが ref num です

また

  • ノード: この参照を削除します
  • C アプリ: わかりました。

2つの間でメッセージを渡す簡単な方法はありますか?

現在の私の理論的な考えは、次のようなものです。

  1. 2 つのプロセス間に 1 つの tcp/unix ソケットを配置し、1 つのセッションのみを使用して、常にセッションを開いたり閉じたりしないようにします (一度に多くのセッションが発生することも懸念されます)。
  2. 一致する各ノード要求と C アプリ応答には同じ ID が付けられます (単一の TCP セッションを介した TCP 風のセッション)
  3. 関連するノード要求ごとに C アプリへのメッセージが生成され、応答オブジェクトがセッション ID をキーとしてハッシュに格納されます。
  4. C アプリの応答を収集し、セッション ID で応答オブジェクトを検索し、クライアントに応答する単一ノード スレッドを用意する

それはひどく非効率的ですか?

ノードに実際にスレッドのサポートはありますか? (短いグーグルでは具体的な結果は得られませんでした)

4

1 に答える 1

4

基本的に、あなたは正しい方向に進んでいます。ある種のプロセス間通信が必要です。それは、IPC の複雑さに大きく依存します。メソッドの呼び出しとメソッド間での単純な (つまり、整数、文字列) データの共有だけの場合は、実装がかなり簡単で、nodejs によってネイティブにサポートされ、C から非常に使いやすい UNIX ソケットを使用できます。まあ(必要なヘッダーはほとんどの場合すでに利用可能であるため)

ZeroMQ は、トランスポートの抽象化 (IPC または真のネットワークベースのトランスポートを可能にする) と、あいまいな言語に対する多くのバインディングを提供します。C および Node.js 用に提供されている例を使用すると、すぐに作業を開始できます。ただし、対応するヘッダーとライブラリが必要です。ほとんどの場合、最初にビルドする必要があります。

プログラム間で交換するデータがより複雑になる場合 (構造体または配列の読み取り、ネストされたオブジェクト)、実際の RPC 実装が必要になります。そこにはたくさんの RPC 実装があります。機能面では Apache Thrift は非常に有望に思えましたが、最終的には適切な時間内に Thrift コンパイラをビルドすることができませんでした。

そのため、最終的には、かなり似たようなユースケースを持つ私にとって、トランスポートの抽象化に ZeroMQ を使用し、その上で JSON-RPC を RPC メカニズムとして使用することになりました。JSON-RPC は、nodejs と、ZeroMQ と Jansson を基に構築されたhttps://github.com/pijoi/jsonrpcを使用する CI にかなりネイティブです。ドキュメントは存在しませんが、そこまで来れば恐れる必要はありません。

パフォーマンスに関しては、これが問題になるとは思いません。短時間に大量のリクエストがあるように、あなたのユースケースは聞こえません。ZeroMQ はトランスポートとして従来の IPC も提供するため、それを使用してパフォーマンスを向上させることもできます。

于 2013-12-12T17:16:53.020 に答える