NextGen Server/Client Architecture - gRPC + Unity + C#
-
Upload
yoshifumi-kawai -
Category
Software
-
view
10.434 -
download
22
Transcript of NextGen Server/Client Architecture - gRPC + Unity + C#
![Page 1: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/1.jpg)
![Page 2: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/2.jpg)
http://grani.jp/
http://engineering.grani.jp/
https://github.com/neuecc/UniRx/
https://github.com/neuecc/ZeroFormatter/
![Page 3: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/3.jpg)
![Page 4: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/4.jpg)
using
![Page 5: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/5.jpg)
Before gRPC
![Page 6: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/6.jpg)
ネイティブモバイルRPG
(旧)技術選択
![Page 7: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/7.jpg)
![Page 8: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/8.jpg)
![Page 9: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/9.jpg)
うーん、びみょい...
![Page 10: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/10.jpg)
Move to gRPC
![Page 11: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/11.jpg)
Web API + Streaming
![Page 12: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/12.jpg)
C#版も当然ありますhttps://github.com/grpc/grpc/tree/master/src/csharp
![Page 13: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/13.jpg)
gRPC ClientのUnity移植
https://github.com/neuecc/MagicOnion/tree/master/src/MagicOnion.Client.Unity/Assets/Scripts/gRPC
https://github.com/grani/gRPC/tree/UnityClient
google/protobufの置き換え
https://github.com/neuecc/ZeroFormatter/
![Page 14: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/14.jpg)
![Page 15: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/15.jpg)
(恐らく)世界初のgRPC + Unity
![Page 16: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/16.jpg)
サーバーのエラーメッセージの日本語が消えるhttps://github.com/grpc/grpc/issues/9235
![Page 17: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/17.jpg)
とにかくUnity Editorと相性が悪い
![Page 18: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/18.jpg)
Architecture
![Page 19: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/19.jpg)
![Page 20: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/20.jpg)
![Page 21: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/21.jpg)
![Page 22: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/22.jpg)
![Page 23: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/23.jpg)
メソッド呼んで1:1で受信
![Page 24: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/24.jpg)
サーバー側でクライアント切断を検知できない
DuplexStreamingで繋ぎっぱにしとくというハック
https://github.com/grpc/grpc/issues/8932
![Page 25: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/25.jpg)
Streamingとグレースフルリスタート
Blue-Green Deployment
![Page 26: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/26.jpg)
MagicOnion
![Page 28: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/28.jpg)
gRPC IN(byte[])
gRPC OUT(byte[])
RPC Method
MagicOnion Filters
IDL Less HandlerSelector
Custom Serialization
![Page 29: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/29.jpg)
gRPC IN(byte[])
gRPC OUT(byte[])
RPC Method
MagicOnion Filters
IDL Less HandlerSelector
Custom Serialization
![Page 30: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/30.jpg)
public class TestService : MagicOnionService{
// define public methodpublic async Task<int> Sum(int x, int y){
return x + y;}
public async Task<string> Download(string url){
// async/await supportvar result = await new HttpClient().GetStringAsync(url);return result;
}}
struct DynamicTuple{
public int x;public int y;
}
![Page 31: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/31.jpg)
// standard gRPC connectionvar channel = new Channel("127.0.0.1:12345");
// Client will be run-time generated as “.Create<TService>()” and called seamlessly.var result = await MagicOnionClient.Create<TestService>(channel).Sum(100, 200);
![Page 32: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/32.jpg)
言語の違うRESTResponse型を別々
に書くAPIクライアントを手書きする
(ザ・マイクロサービスみたいな
構成)
中間IDLを書くそこからクライアント・レスポンス型自動生成
(←を嫌う時によくある構成、一番メジャー)
サービスを普通に書く、そこからクライアントを自動生成、リクエスト・レスポンス型はC#のDLLとして
共有
サービスを普通に書く、クライアントはそのプロジェクト参照から実行時動的生成
![Page 33: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/33.jpg)
// filter can attach per global/class/methodpublic class SampleFilterAttribute : MagicOnionFilterAttribute{
public override async Task Invoke(ServiceContext context){
try{
/* before invoke next */await Next.Invoke(context);/* after invoke next */
}catch (Exception ex){
/* when exception */}finally{
/* finalize */}
}}
![Page 34: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/34.jpg)
![Page 35: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/35.jpg)
![Page 36: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/36.jpg)
ZeroFormatterhttps://github.com/neuecc/ZeroFormatter/
MessagePack for C#https://github.com/neuecc/MessagePack-CSharp
![Page 37: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/37.jpg)
Conclusion
![Page 38: NextGen Server/Client Architecture - gRPC + Unity + C#](https://reader034.fdocuments.net/reader034/viewer/2022042500/58e4abeb1a28abbb038b5851/html5/thumbnails/38.jpg)
C#で統一 + gRPCで統一Web APIもRealtimeも含めて、gRPCに徹底的に移行(中)
実にリスキーで愚かな話です!
Next Standard を作るつもりでやってるし、黒騎士で証明する!
gRPCは成長途上周辺環境が弱い(ロードバランサーもあんま対応してないし)
情報があるようでない(UnaryはともかくStreamingのノウハウは……)
が、しかしgoogleの本気度は高い(GCPのAPIはどんどんgRPCで提供されてってるし←こないだのSpannerなども)
全力で乗っかっていくし、C#でのBest Practiceを確立していきたい