SlideShare a Scribd company logo
NextGen Server/Client Architecture - gRPC + Unity + C#
http://grani.jp/
http://engineering.grani.jp/
https://github.com/neuecc/UniRx/
https://github.com/neuecc/ZeroFormatter/
NextGen Server/Client Architecture - gRPC + Unity + C#
using
Before gRPC
ネイティブモバイルRPG
(旧)技術選択
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
うーん、びみょい...
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/
NextGen Server/Client Architecture - gRPC + Unity + C#
(恐らく)世界初のgRPC + Unity
サーバーのエラーメッセージの日本語が消える
https://github.com/grpc/grpc/issues/9235
とにかくUnity Editorと相性が悪い
Architecture
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
メソッド呼んで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 method
public async Task<int> Sum(int x, int y)
{
return x + y;
}
public async Task<string> Download(string url)
{
// async/await support
var result = await new HttpClient().GetStringAsync(url);
return result;
}
}
struct DynamicTuple
{
public int x;
public int y;
}
// standard gRPC connection
var 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);
言語の違うREST
Response型を別々
に書く
APIクライアント
を手書きする
(ザ・マイクロ
サービスみたいな
構成)
中間IDLを書く
そこからクライア
ント・レスポンス
型自動生成
(←を嫌う時によ
くある構成、一番
メジャー)
サービスを普通に
書く、そこからク
ライアントを自動
生成、リクエス
ト・レスポンス型
はC#のDLLとして
共有
サービスを普通��
書く、クライアン
トはそのプロジェ
クト参照から実行
時動的生成
// filter can attach per global/class/method
public 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 */
}
}
}
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
ZeroFormatter
https://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を確立していきたい

More Related Content

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