O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

66.658 visualizações

Publicada em

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

Publicada em: 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を確立していきたい

×