Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

49,850 views

Published on

Grani x KAYAC
http://engineering.grani.jp/
http://techblog.kayac.com/

Published in: Software

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

  1. 1. http://grani.jp/ http://engineering.grani.jp/ https://github.com/neuecc/UniRx/ https://github.com/neuecc/ZeroFormatter/
  2. 2. using
  3. 3. Before gRPC
  4. 4. ネイティブモバイルRPG (旧)技術選択
  5. 5. うーん、びみょい...
  6. 6. Move to gRPC
  7. 7. Web API + Streaming
  8. 8. C#版も当然あります https://github.com/grpc/grpc/tree/master/src/csharp
  9. 9. 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/
  10. 10. (恐らく)世界初のgRPC + Unity
  11. 11. サーバーのエラーメッセージの日本語が消える https://github.com/grpc/grpc/issues/9235
  12. 12. とにかくUnity Editorと相性が悪い
  13. 13. Architecture
  14. 14. メソッド呼んで1:1で受信
  15. 15. サーバー側でクライアント切断を検知できない DuplexStreamingで繋ぎっぱにしとくというハック https://github.com/grpc/grpc/issues/8932
  16. 16. Streamingとグレースフルリスタート Blue-Green Deployment
  17. 17. MagicOnion
  18. 18. gRPC上に構築された自社構築フレームワーク https://github.com/neuecc/MagicOnion
  19. 19. gRPC IN(byte[]) gRPC OUT(byte[]) RPC Method MagicOnion Filters IDL Less HandlerSelector Custom Serialization
  20. 20. gRPC IN(byte[]) gRPC OUT(byte[]) RPC Method MagicOnion Filters IDL Less HandlerSelector Custom Serialization
  21. 21. 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; }
  22. 22. // 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);
  23. 23. 言語の違うREST Response型を別々 に書く APIクライアント を手書きする (ザ・マイクロ サービスみたいな 構成) 中間IDLを書く そこからクライア ント・レスポンス 型自動生成 (←を嫌う時によ くある構成、一番 メジャー) サービスを普通に 書く、そこからク ライアントを自動 生成、リクエス ト・レスポンス型 はC#のDLLとして 共有 サービスを普通に 書く、クライアン トはそのプロジェ クト参照から実行 時動的生成
  24. 24. // 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 */ } } }
  25. 25. ZeroFormatter https://github.com/neuecc/ZeroFormatter/ MessagePack for C# https://github.com/neuecc/MessagePack-CSharp
  26. 26. Conclusion
  27. 27. C#で統一 + gRPCで統一 Web APIもRealtimeも含めて、gRPCに徹底的に移行(中) 実にリスキーで愚かな話です! Next Standard を作るつもりでやってるし、黒騎士で証明する! gRPCは成長途上 周辺環境が弱い(ロードバランサーもあんま対応してないし) 情報があるようでない(UnaryはともかくStreamingのノウハウは……) が、しかしgoogleの本気度は高い(GCPのAPIはどんどんgRPCで提供 されてってるし←こないだのSpannerなども) 全力で乗っかっていくし、C#でのBest Practiceを確立していきたい

×