MagicOnion에서 gRPC의 keepalive 주위를 설정하는 방법
8642 단어 gRPC.NETUnityMagicOnionC#
소개
MagicOnion의 StreamingHub를 사용할 때 클라이언트 측에서 인터넷 연결을 끊어도,
서버측으로부터 클라이언트의 종료를 즉시 검지할 수 없었습니다. .
나의 환경에서는 그 거동에서도 문제가 없었기 때문에 방치하고 있었습니다만,
그 밖에도 고민하고 있는 분이 있는 것 같았으므로, 조사하기로 했습니다
그 결과, 분명히 gRPC의 keepalive 설정을 실시하는 것으로 대책 할 수있을 것 같았습니다
앞으로도 keepalive 설정을 할 가능성이 있으므로 기사로 남기기로했습니다
운영 환경
.NET Core 서버
Unity 클라이언트
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_ms
에 grpc.keepalive_time_ms
와 grpc.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 주위의 설정 밖에 만지는 것은 없을 것 같다고 느꼈습니다
참고 링크
클라이언트 측과 서버 측 모두 동일한 값을 설정했지만,
만약을 위해, 실제로 설정했을 때의 코드에 대해서 양자 기재해 둡니다
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 주위의 설정 밖에 만지는 것은 없을 것 같다고 느꼈습니다
참고 링크
Reference
이 문제에 관하여(MagicOnion에서 gRPC의 keepalive 주위를 설정하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nikaera/items/9f9319432134b30f4afe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)