問題タブ [grpc-node]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
docker - Dockerizing gRPC サーバー (ノード) の問題: [エラー: 現在のシステムにインストールされていないため、gRPC バイナリ モジュールを読み込めませんでした]
Docker イメージを実行するたびに、ノードのシステム/アーキテクチャ間の非互換性に関するエラーが発生し続けます...
私はこのコマンドを試しました:
しかし、問題はまだ続きます...
より多くのコンテキストのための私のファイルは次のとおりです。
Docker イメージを実行しようとした後、完全なエラーが発生しました
Dockerfile (gRPC ノード サーバーを実行)
Booksserver.js (GRPC サーバー)
docker - Docker:特定のコンテナから別のコンテナのファイルにアクセスする方法は?
基本的に、メイン ディレクトリと Books ディレクトリがあります (一般的なファイル構造、他にもありますが、これらは重要な部分です)。そのため、main から booksServer へのリクエストを発行しても、ノード モジュールが見つからないため機能しません。
これは、ノード モジュールが特定のパス '/usr/src/app'の docker コンテナー内にあるためです。
ブック (サービス/コンテナー) がこの特定のパス内に適切なノード パッケージを持っていることを main.js に確認させるにはどうすればよいですか?
docker-compose は使えると思いますが、まずは docker-compose を使わずに個別にテストしたいと思いました。
内部
エラー:
書籍の Dockerfile
メイン DockerFile
docker - gRPC-Node エラー: JSON の位置 0 に予期しないトークン u があります
そのため、この「位置0のJSONの予期しないトークンu」エラーが発生し続けます。私は現在、顧客のgRPCサーバーにgRPCリクエストを行っているメインのイニシエーターからリクエストを行っています。
ファイルをコンテナ化せず、各ディレクトリに手動で npm インストール パッケージをインストールすると、スムーズに動作します。ただし、ファイルをコンテナ化すると、何らかの理由でこの問題が発生します。
通常、この問題は非同期リクエストで発生し (gRPC は非同期なので理にかなっています)、完了するまで競争していると思いますが、そうすることができません。しかし、dockerFile は文字通り私が手動で行っていることを行っています (これは機能します...)
私は現在、なぜこれが事実なのかについて迷っています。
エラー
ファイル構造
Docker ファイル(全て)
grpc - ファイルを file_pb.js から file.proto にコンパイルします
このコマンドfile.proto
を使用してから にコンパイルする方法を知っています。file_pb.js
file_pb.js
しかし、どうすれば からに変換できますかfile.proto
protocol-buffers - nodejs + grpc-node サーバーは REST よりもはるかに遅い
私は 2 つのサービス A と B を実装しました。A は gRPC (Mali で grpc-node を使用) と純粋な HTTP REST 呼び出しの両方を介して B と通信できます。
リクエストのサイズは無視できます。
応答サイズは、次のような 1000 アイテムです。
A と B の両方がサービスとして GKE にデプロイされ、kube-proxy を使用して内部ネットワーク経由で通信します。
私が発見したのは、REST バージョンが gRPC よりもはるかに高速であることです。REST 呼び出しの p99 は 1 秒未満であり、gRPC の p99 は 30 秒を超えることがあります。
詳細
ノードのバージョンと OS:node:14.7.0-alpine3.12
依存関係:
gRPC オプションを設定してクライアント側の TCP プーリングを作成しましgrpc.use_local_subchannel_pool=1
たが、これは役に立たないようです。
call.startBatch
grpc libの呼び出しがサイズ〜51kbのデータを送信するのに何秒もかかったことがログからわかるように、問題はサーバー側にあるようです。これは REST バージョンよりもかなり遅いです。
また、サービスの CPU とネットワークが正常であることも確認しました。REST バージョンは 2 mbps を超える速度で送信できましたが、gRPC バージョンは最大 150 kbps しか管理できませんでした。
netstat
サービス B で (gRPC で)実行すると、多くの ESTABLISHED TCP 接続が表示されます (TCP プーリングのために予想どおり)。
私の疑いは、grpc-core C++ コードが REST より最適ではないということですが、証拠はありません。
次に見るべきアイデアはありますか?助けてくれてありがとう
更新 1
いくつかのベンチマークを次に示します。
設定
Blazemeter --REST--> services A --gRPC/REST--> service B
- リクエストボディ(両方のラグ)は無視できます
service A
はノードサービス + Koaservice B
3 つのオプションがあります。grpc-node
: grpc-node を持つノードgRPC + Go
: 同じ gRPC サービスの Go 実装REST + Koa
: Koa のあるノード
Blazemeter --> service A
: 応答ペイロードは無視でき、すべてのテストで同じですserivce A --> service B
: gRPC/REST 応答ペイロードは 1000 個ですProductPrice
:
サービスは GCP の Kubernetes にデプロイされ、
- インスタンスタイプ:
n1-highcpu-4
- サービスごとに 5 つのポッド
- 各ポッドに 2 つの CPU、1 GB のメモリ
- クラスター IP を使用する kube-proxy (インターネット経由ではない) (ヘッドレスを
clusterIP: None
でテストしたところ、同様の結果が得られました)
ロード
50rps
結果
grpc-node を使用したサービス B
Go gRPC を使用したサービス B
Koa で REST を使用するサービス B
ネットワーク IO
観察
gRPC + Go
とほぼ同等ですREST
(gRPCの方が速いと思いました)grpc-node
よりも 4 倍遅いREST
- ネットワークがボトルネックではない