[Go,Python]gRPC体験


gRPCとは?



gRPCはグーグルが開発したリモートプロシージャ呼び出し(RPC)システムである.
gRPCはHTP/2を用いてデータ転送を行い、IDL(インタフェース記述言語)をProtocal Bufferとして使用する.さらに、認証、双方向ストリーム管理、ブロック、非ブロックバインドなど多くの機能を提供します.

RPC(Remote procedure call)


分散システムでは、1つのプログラムが実行中に別のアドレス空間(別のプロセス、別のコンピュータ...)を有する.実行されるプロセス(サブルーチン)をRPCと呼ぶ.
RPCはrequest-responseプロトコルを使用します.元のプログラムはrequstを別のアドレス空間に送信し、この要求を受信したサーバはプロセスを実行し、結果を元のプログラム(応答)に再送信します.
これらRPCの実施.
  • GoogleのgRPC
  • Thrift,
  • Facebook
  • TwitterのFinalge
  • 背中がある.

    HTTP/2


    HTTP/1.1の欠点では、プロトコルの性能を向上させた伝送プロトコルがある.既存のHTTP/2は以下の改善点を有する.
  • Multiplexed Streams
    これは、
  • の1つの接続で複数のメッセージを同時に送信する技術である.シーケンスに関係なく、Streamを介して応答を受信できます.
  • Stream Prioritization
  • リソース間の依存関係に基づいて優先度を設定し、リソースをロードします.
  • Server Push
  • サーバは、クライアントが要求していないリソースをクライアントに送信することができる.
  • Header Compression
  • Header TableおよびHuffman Encode技術によってヘッドの繰返しを低減し、圧縮する.
  • protocol buffers


    protocolbuffersはグーグルが公開したプラットフォーム間フォーマットで、IDLの一種です.構造化データを言語、プラットフォーム(データを格納可能な形式に変換する)に中立的にシーケンス化する方法を制限します.

    簡単です。proto作成例

    syntax = "proto3"; // proto3, proto2 중에 사용할 버전 명시
    
    package proto_test; // package 이름 명시
    
    service RpcService { // RPC service 이름 정의(CamelCase with an initial capital)
     rpc 함수명 (입력Message) returns (출력Message);
    }
    
    message 입력Message {
     string name = 1;
    }
    
    message 출력Message {
     string code = 1;
     string name = 2;
     string symbol = 3;
    }

    IDL(Interface Definition Language)


    IDLは、異なるソフトウェアコンポーネント間のデータ構造およびインタフェースを記述する記述言語である.
    IDLは、いずれの言語にも限定されない中立的な方法でインタフェースを表現し、同じ言語を使用しないソフトウェアコンポーネント間の通信を可能にする.

    gRPC構成



    gRPCは、gRPCサーバとgRPCクライアント(stub)から構成される.

  • gRPCサーバ
    サービスの関数はサーバの言語で定義されているため、stubが要求を受信すると実行されます.

  • gRPCクライアント(stub)
    定義されたprotoファイルと一致する変換関数があります.サービス内の関数を呼び出す場合は、stub言語を使用して生成されたデータをシーケンス化し、gRPCサーバに送信し、結果値を逆シーケンス化します.
  • gRPC compile


    異なる言語のgRPCコンパイラを通じて.protoファイルは、各言語に適したファイルに変換できます.まず.protoファイルを作成すると、共通のファイルが作成されます.protoファイルを使用して、サーバとクライアントでそれぞれコンパイルします.

    1) .protoファイルの作成

    
    syntax = "proto3";
    
    package helloworld;
    
    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    // The request message containing the user's name.
    message HelloRequest {
      string name = 1;
    }
    
    // The response message containing the greetings
    message HelloReply {
      string message = 1;
    }

    2) server compile

    > protoc --proto_path=<.proto파일의 dir경로> \
    		 --go_out=plugins=grpc:<정의한 package이름>  \
            .proto파일

    3) client compile

    > python -m grpc_tools.protoc \
    			--proto_path <.proto파일의 dir경로> \
    			--python_out=<출력 .py파일 경로> \
                --grpc_python_out=<출력 .py파일 경로> \
    	        <.proto파일경로>

    gRPC life cycle


    Uray(一方向)RPC


    これは最も簡単なRPCです.Cilentはリクエストを発行し,サーバがリクエストを受信すると結果値を返す構造である.

    Server streaming RPC


    Urayと似ていますが、サーバがストリーミングメッセージを応答として送信する点が異なります.streamingメッセージがすべて転送されると、サーバはサーバのstatusまたは他のmetaデータを追加的に転送します.

    Client streaming RPC


    Urayと似ていますが、Cilentはstreamingメッセージを要求することによって異なります.streamingメッセージがすべて受信されると、サーバは応答(必須x)を送信します.

    Bidirectional streaming RPC


    クライアントは特定の関数を呼び出し、Sercerがクライアントメタデータ、メソッド名、および締め切り日を受信すると起動します.サーバとクライアントは、ストリームデータを同時に交換できます.この2つのストリームは独立しています.

    Example

  • https://github.com/deagwon97/grpc-go-python
  • Reference

  • https://en.wikipedia.org/wiki/GRPC
  • https://brownbears.tistory.com/512
  • https://chacha95.github.io/2020-06-15-gRPC1/
  • https://en.wikipedia.org/wiki/Remote_procedure_call
  • https://seokbeomkim.github.io/posts/http1-http2/
  • https://yoongrammer.tistory.com/14
  • https://developers.google.com/protocol-buffers/docs/overview
  • https://www.grpc.io/docs/what-is-grpc/introduction/