Top Banner
38

NextGen Server/Client Architecture - gRPC + Unity + C#

Apr 11, 2017

Download

Software

Yoshifumi Kawai
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 2: NextGen Server/Client Architecture - gRPC + Unity + C#

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#
Page 4: NextGen Server/Client Architecture - gRPC + Unity + C#

using

Page 5: NextGen Server/Client Architecture - gRPC + Unity + C#

Before gRPC

Page 6: NextGen Server/Client Architecture - gRPC + Unity + C#

ネイティブモバイルRPG

(旧)技術選択

Page 7: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 8: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 9: NextGen Server/Client Architecture - gRPC + Unity + C#

うーん、びみょい...

Page 10: NextGen Server/Client Architecture - gRPC + Unity + C#

Move to gRPC

Page 11: NextGen Server/Client Architecture - gRPC + Unity + C#

Web API + Streaming

Page 12: NextGen Server/Client Architecture - gRPC + Unity + C#

C#版も当然ありますhttps://github.com/grpc/grpc/tree/master/src/csharp

Page 13: NextGen Server/Client Architecture - gRPC + Unity + C#

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#
Page 15: NextGen Server/Client Architecture - gRPC + Unity + C#

(恐らく)世界初のgRPC + Unity

Page 16: NextGen Server/Client Architecture - gRPC + Unity + C#

サーバーのエラーメッセージの日本語が消えるhttps://github.com/grpc/grpc/issues/9235

Page 17: NextGen Server/Client Architecture - gRPC + Unity + C#

とにかくUnity Editorと相性が悪い

Page 18: NextGen Server/Client Architecture - gRPC + Unity + C#

Architecture

Page 19: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 20: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 21: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 22: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 23: NextGen Server/Client Architecture - gRPC + Unity + C#

メソッド呼んで1:1で受信

Page 24: NextGen Server/Client Architecture - gRPC + Unity + C#

サーバー側でクライアント切断を検知できない

DuplexStreamingで繋ぎっぱにしとくというハック

https://github.com/grpc/grpc/issues/8932

Page 25: NextGen Server/Client Architecture - gRPC + Unity + C#

Streamingとグレースフルリスタート

Blue-Green Deployment

Page 26: NextGen Server/Client Architecture - gRPC + Unity + C#

MagicOnion

Page 27: NextGen Server/Client Architecture - gRPC + Unity + C#

gRPC上に構築された自社構築フレームワークhttps://github.com/neuecc/MagicOnion

Page 28: NextGen Server/Client Architecture - gRPC + Unity + C#

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

MagicOnion Filters

IDL Less HandlerSelector

Custom Serialization

Page 29: NextGen Server/Client Architecture - gRPC + Unity + C#

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

MagicOnion Filters

IDL Less HandlerSelector

Custom Serialization

Page 30: NextGen Server/Client Architecture - gRPC + Unity + C#

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#

// 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#

言語の違うRESTResponse型を別々

に書くAPIクライアントを手書きする

(ザ・マイクロサービスみたいな

構成)

中間IDLを書くそこからクライアント・レスポンス型自動生成

(←を嫌う時によくある構成、一番メジャー)

サービスを普通に書く、そこからクライアントを自動生成、リクエスト・レスポンス型はC#のDLLとして

共有

サービスを普通に書く、クライアントはそのプロジェクト参照から実行時動的生成

Page 33: NextGen Server/Client Architecture - gRPC + Unity + C#

// 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#
Page 35: NextGen Server/Client Architecture - gRPC + Unity + C#
Page 36: NextGen Server/Client Architecture - gRPC + Unity + C#

ZeroFormatterhttps://github.com/neuecc/ZeroFormatter/

MessagePack for C#https://github.com/neuecc/MessagePack-CSharp

Page 37: NextGen Server/Client Architecture - gRPC + Unity + C#

Conclusion

Page 38: NextGen Server/Client Architecture - gRPC + Unity + C#

C#で統一 + gRPCで統一Web APIもRealtimeも含めて、gRPCに徹底的に移行(中)

実にリスキーで愚かな話です!

Next Standard を作るつもりでやってるし、黒騎士で証明する!

gRPCは成長途上周辺環境が弱い(ロードバランサーもあんま対応してないし)

情報があるようでない(UnaryはともかくStreamingのノウハウは……)

が、しかしgoogleの本気度は高い(GCPのAPIはどんどんgRPCで提供されてってるし←こないだのSpannerなども)

全力で乗っかっていくし、C#でのBest Practiceを確立していきたい