MagicOnion에서 gRPC의 keepalive 주위를 설정하는 방법

소개



MagicOnion의 StreamingHub를 사용할 때 클라이언트 측에서 인터넷 연결을 끊어도,
서버측으로부터 클라이언트의 종료를 즉시 검지할 수 없었습니다. .

나의 환경에서는 그 거동에서도 문제가 없었기 때문에 방치하고 있었습니다만,
그 밖에도 고민하고 있는 분이 있는 것 같았으므로, 조사하기로 했습니다

그 결과, 분명히 gRPC의 keepalive 설정을 실시하는 것으로 대책 할 수있을 것 같았습니다
앞으로도 keepalive 설정을 할 가능성이 있으므로 기사로 남기기로했습니다

운영 환경



  • .NET Core 서버
  • ASP.NET Core 2.2
  • MagicOnion 2.1.0(2.1.2)


  • Unity 클라이언트
  • Unity 2019.1.4f1
  • MagicOnion 2.1.0(2.1.2)
  • grpc_ 우니 ty_ 퍼크 게. 1.22.0-v. 지 p
  • macOS Mojave 10.14.5


  • keepalive 관련 gRPC 채널 옵션



    이해하기 쉬운 문서를 찾을 수 없었기 때문에,
    gRPC 채널에서 구성 가능한 구성은 공식 링크을 참조했습니다.

    구성을 한 번에 확인한 결과 keepalive 주위의 설정을 실시하기 위해,
    필요할 것 같은 세 가지 주요 옵션이 있습니다


    이름
    설명


    grpc.keepalive_time_ms
    ping 간격 (ms 단위)

    grpc.keepalive_timeout_ms
    ping이 허용하는 응답 시간(ms)

    grpc.http2.min_time_between_pings_ms
    ping을 연속적으로 전송할 수 있는 최소 간격(ms 단위)

    grpc.http2.min_time_between_pings_msgrpc.keepalive_time_msgrpc.keepalive_timeout_ms를 더한 값을 설정하면 좋을 것 같습니다

    gRPC 채널에 keepalive 관련 옵션 설정



    클라이언트 측과 서버 측 모두 동일한 값을 설정했지만,
    만약을 위해, 실제로 설정했을 때의 코드에 대해서 양자 기재해 둡니다

    Unity 클라이언트 측


    // 各種 keepalive 関連のオプションを設定する
    List<ChannelOption> options = new List<ChannelOption> {
        new ChannelOption("grpc.keepalive_time_ms", 2000),
        new ChannelOption("grpc.keepalive_timeout_ms", 3000),
        new ChannelOption("grpc.http2.min_time_between_pings_ms", 5000),
    };
    
    // gRPC チャネル生成時の第3引数に IEnumerable でオプションを指定する
    channel = new Channel(m_MagicOnionHost, 12345, ChannelCredentials.Insecure, options);
    

    MagicOnion 서버 측


    // 各種 keepalive 関連のオプションを設定する
    List<ChannelOption> options = new List<ChannelOption> {
        new ChannelOption("grpc.keepalive_time_ms", 2000),
        new ChannelOption("grpc.keepalive_timeout_ms", 3000),
        new ChannelOption("grpc.http2.min_time_between_pings_ms", 5000),
    };
    
    // `UseMagicOnion` 関数の第3引数に IEnumerable でオプションを指定する
    await MagicOnionHost.CreateDefaultBuilder()
        .UseMagicOnion(
            new MagicOnionOptions(isReturnExceptionStackTraceInErrorDetail: true),
            new ServerPort("0.0.0.0", 12345, ServerCredentials.Insecure),
            options
        ).RunConsoleAsync();
    

    이제 MagicOnion에 연결된 클라이언트의 연결이 끊어지면,
    어느 정도 실시간으로 네트워크 연결을 감지할 수 있습니다.

    구체적으로는 클라이언트측의 접속이 끊어지고 나서 MagicOnion 서버측에서 의 로그 출력을 확인할 수 있어,
    OnDisconnected가 호출되었음을 확인할 수 있으면 성공적으로 설정되었습니다
    Keepalive watchdog fired. Closing transport.
    

    결론



    이번에는 절단 감지를 위한 gRPC 채널의 keepalive 설정을 실시했습니다

    gRPC 채널의 keepalive 관련 설정 항목은 그 밖에도 여러 가지가 있기 때문에,
    필요에 따라 이들 항목을 설정함으로써 gRPC 채널의 접속 주위의 거동을 컨트롤 할 수 있을 것 같았습니다.

    또 이번 기사를 계기로 각종 gRPC 옵션을 바라보고 있었습니다만,
    보통으로 사용하고 있는 분에는 keepalive 주위의 설정 밖에 만지는 것은 없을 것 같다고 느꼈습니다

    참고 링크


  • Grpc_arg_keys
  • node.js 의 gRPC client 로 client side keep-alive (정기적인 PING frame 송출)를 실현한다
  • 좋은 웹페이지 즐겨찾기