GRPCでチャンネルを開くためのベストプラクティスは何ですか?

ヘヴィメタル

AGRpc(100+ req / sec)、Java生成スタブを介してサービス(10レプリカ)を呼び出すサービスがありますロードバランサーはありませんが、どちらの場合もベストプラクティスは何ですか。

クライアントはサービスへの呼び出しごとにチャネルを構築する必要がありますAか、それともアプリがシャットダウンするまでManagedChannelを1回作成する必要がありますか?

  1. リクエストごとに1つ作成すると、呼び出しは10個のレプリカに沿って分散されますが、アプリケーションの開始時にのみ作成すると、すべての呼び出しは同じサービスAレプリカに送られます。

  2. 一方、各呼び出しで作成した場合、アイドル状態になるまで(defeaultでは30分)、何千もの接続が開いていませんか?

ManagedChannel managedChannel = ManagedChannelBuilder
                    .forAddress(host, port)
                    .usePlaintext()
                    .build()
ServiceA.newBlockingStub(managedChannel)).fooBar(...)
エリックアンダーソン

ManagedChannelはめったに作成せず、頻繁に再利用する必要があります。ManagedChannelが使用されなくなった場合は、シャットダウンすることが不可欠です。そうしないと、漏れます。

これは負荷分散の質問であり、答えは負荷分散アーキテクチャによって異なります。説明に基づいて、次の2つの構造のいずれかを使用している可能性があります。

  1. すべてのバックエンドはDNSで公開されています。クライアントはバックエンドに直接接続します。これを「露出」と呼びます

  2. クライアントが接続を作成するTCPロードバランサーがあり、バランサーはその接続をバッ​​クエンドに拡張します。これを「隠し」と呼びます

どちらのアプローチでも、nettyServerBuilder.maxConnectionAge(...)クライアントが新しいバックエンドの使用を開始するには、通常、バックエンドを設定する必要があります。

公開されたアーキテクチャでは、ManagedChannelで負荷分散を構成する必要があります。これはおそらく、を使用するのと同じくらい簡単managedChannelBuilder.defaultLoadBalancingPolicy("round_robin")です。round_robin ポリシーは、DNSによって返された各IPアドレスへの接続を行うと、アドレス全体でRPCを配布します。maxConnectionAgeクライアントが原因でバックエンドが切断されると、DNSが再解決され、新しい接続が確立されます。

隠しアーキテクチャでは、各クライアントが各バックエンドと比較して「小さい」クライアントが多数ある場合maxConnectionAge、それで十分です。maxConnectionAgeクライアントが原因でバックエンドが切断されると、新しいバックエンドを選択できるロードバランサーへの新しい接続が確立されます。

隠しアーキテクチャでは、単一のバックエンドが処理できるよりも多くの負荷を生成する「大きな」クライアントがある場合、事態はより困難になります。クライアントはバックエンドの数とその状態を把握できませんが、バックエンド自体で負荷を管理することはできません。ここで行う最も簡単なことは、複数のチャネルを作成し、それらをラウンドロビンすることです。Javaでは、これをとして実装できるChannelため、コードの大部分からは見えませんが原因でバックエンドが切断された場合maxConnectionAgeその1つのチャネルは、新しいバックエンドを選択できるロードバランサーへの新しい接続を確立します。このアプローチの難しさは、いくつのチャネルを作成するかを知ることです。大規模なクライアントを使用する隠しアーキテクチャは、TCP負荷分散の代わりにHTTP負荷分散を使用することで多くのメリットがあります。HTTP負荷分散を使用する場合でも、ロードバランサーの負荷を分散するために、複数の管理対象チャネルを使用する必要がある場合があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アクティビティの上にフラグメントを開くためのベストプラクティスは何ですか

分類Dev

開発ブランチをマスターブランチにマージするためのベストプラクティスは何ですか

分類Dev

Breezeでマルチテナントセキュリティを処理するためのベストプラクティスは何ですか?

分類Dev

マルチスレッドでチタングラフを使用するためのベストプラクティスは何ですか?

分類Dev

Vueコンポーネントでスタイルを使用するためのベストプラクティスは何ですか?

分類Dev

フラグメントでコルーチンを使用するためのベストプラクティスは何ですか?

分類Dev

Googleクラウドインフラストラクチャでデータベース/ディスクストレージをスケーリングするためのベストプラクティスは何ですか?

分類Dev

Androidでレルムクエリをチェーンするためのベストプラクティスは何ですか?

分類Dev

PostgreSQLでシーケンシャルコードを生成するためのベストプラクティスは何ですか

分類Dev

PyTorchのCPU(GPUではなく)でディープモデルをベンチマークするためのベストプラクティス?

分類Dev

tornadofxでカスタマイズされたUIコンポーネントを作成するためのベストプラクティスは何ですか?

分類Dev

例外をキャッチして再スローするためのベストプラクティスは何ですか?

分類Dev

さまざまなJavaコレクションをベンチマークするためのベストプラクティスは何ですか?

分類Dev

Rxハンドラーを実装するためのベストプラクティスは何ですか?

分類Dev

同じリンクを複数回使用するためのベストプラクティスは何ですか?

分類Dev

組成物での授業のためのテストを書くためのベストプラクティスは何ですか

分類Dev

Vuexモジュールを分離するためのベストプラクティスは何ですか?

分類Dev

コンポーネント内でredux状態を使用するためのベストプラクティスは何ですか?

分類Dev

X線デーモンを設定するためのベストプラクティスは何ですか?

分類Dev

マージされたリモートブランチを修正するためのベストプラクティスは何ですか?

分類Dev

非同期実行で関数チェーンの実行を停止するためのベストプラクティスは何ですか?

分類Dev

ローカル開発にkubernetesを使用するためのベストプラクティスは何ですか?

分類Dev

統合テストを実行するためのベスト プラクティスは何ですか?

分類Dev

Spring JPAでマルチテネンシーのユニバーサル基準を適用するためのベストプラクティスは?

分類Dev

Python-クラス変数を返すためのベストプラクティスは何ですか?

分類Dev

iOSでキャッシュディレクトリをクリアするためのベストプラクティスは何ですか?

分類Dev

C / C ++でunix / linuxコマンドラインツールを作成するためのベストプラクティスは何ですか?

分類Dev

asp.netmvcでエラーを返すためのベストプラクティスは何ですか

分類Dev

JDBCでSQLクエリを作成するためのベストプラクティスは何ですか

Related 関連記事

  1. 1

    アクティビティの上にフラグメントを開くためのベストプラクティスは何ですか

  2. 2

    開発ブランチをマスターブランチにマージするためのベストプラクティスは何ですか

  3. 3

    Breezeでマルチテナントセキュリティを処理するためのベストプラクティスは何ですか?

  4. 4

    マルチスレッドでチタングラフを使用するためのベストプラクティスは何ですか?

  5. 5

    Vueコンポーネントでスタイルを使用するためのベストプラクティスは何ですか?

  6. 6

    フラグメントでコルーチンを使用するためのベストプラクティスは何ですか?

  7. 7

    Googleクラウドインフラストラクチャでデータベース/ディスクストレージをスケーリングするためのベストプラクティスは何ですか?

  8. 8

    Androidでレルムクエリをチェーンするためのベストプラクティスは何ですか?

  9. 9

    PostgreSQLでシーケンシャルコードを生成するためのベストプラクティスは何ですか

  10. 10

    PyTorchのCPU(GPUではなく)でディープモデルをベンチマークするためのベストプラクティス?

  11. 11

    tornadofxでカスタマイズされたUIコンポーネントを作成するためのベストプラクティスは何ですか?

  12. 12

    例外をキャッチして再スローするためのベストプラクティスは何ですか?

  13. 13

    さまざまなJavaコレクションをベンチマークするためのベストプラクティスは何ですか?

  14. 14

    Rxハンドラーを実装するためのベストプラクティスは何ですか?

  15. 15

    同じリンクを複数回使用するためのベストプラクティスは何ですか?

  16. 16

    組成物での授業のためのテストを書くためのベストプラクティスは何ですか

  17. 17

    Vuexモジュールを分離するためのベストプラクティスは何ですか?

  18. 18

    コンポーネント内でredux状態を使用するためのベストプラクティスは何ですか?

  19. 19

    X線デーモンを設定するためのベストプラクティスは何ですか?

  20. 20

    マージされたリモートブランチを修正するためのベストプラクティスは何ですか?

  21. 21

    非同期実行で関数チェーンの実行を停止するためのベストプラクティスは何ですか?

  22. 22

    ローカル開発にkubernetesを使用するためのベストプラクティスは何ですか?

  23. 23

    統合テストを実行するためのベスト プラクティスは何ですか?

  24. 24

    Spring JPAでマルチテネンシーのユニバーサル基準を適用するためのベストプラクティスは?

  25. 25

    Python-クラス変数を返すためのベストプラクティスは何ですか?

  26. 26

    iOSでキャッシュディレクトリをクリアするためのベストプラクティスは何ですか?

  27. 27

    C / C ++でunix / linuxコマンドラインツールを作成するためのベストプラクティスは何ですか?

  28. 28

    asp.netmvcでエラーを返すためのベストプラクティスは何ですか

  29. 29

    JDBCでSQLクエリを作成するためのベストプラクティスは何ですか

ホットタグ

アーカイブ