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

Post on 11-Apr-2017

10410 Views

Category:

Software

22 Downloads

Preview:

Click to see full reader

Transcript

http://grani.jp/

http://engineering.grani.jp/

https://github.com/neuecc/UniRx/

https://github.com/neuecc/ZeroFormatter/

using

Before gRPC

ネイティブモバイルRPG

(旧)技術選択

うーん、びみょい...

Move to gRPC

Web API + Streaming

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

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/

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

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

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

Architecture

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

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

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

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

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

Blue-Green Deployment

MagicOnion

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

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

MagicOnion Filters

IDL Less HandlerSelector

Custom Serialization

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

MagicOnion Filters

IDL Less HandlerSelector

Custom Serialization

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;

}

// 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);

言語の違うRESTResponse型を別々

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

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

構成)

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

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

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

共有

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

// 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 */}

}}

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

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

Conclusion

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

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

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

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

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

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

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

top related