Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

Yoshifumi Kawai
June 01, 2017
120

「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

AWS Summit Tokyo 2017

Yoshifumi Kawai

June 01, 2017
Tweet

More Decks by Yoshifumi Kawai

Transcript

  1. リリース! プロジェクト始動! 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から スタート(つまり動くかも未検証)

    この辺でWeb APIも含めて 完全移行完了(ギリギリ 某ネットワークミドルウェアに リアルタイム通信を載せかえる、 Web APIはHTTP/1で継続
  2. 言語の違うREST Response型を別々 に書く APIクライアント を手書きする (ザ・マイクロ サービスみたいな 構成) 中間IDLを書く そこからクライア

    ント・レスポンス 型自動生成 (←を嫌う時によ くある構成、一番 メジャー) サービスを普通に 書く、そこからク ライアントを自動 生成、リクエス ト・レスポンス型 はC#のDLLとして 共有 サービスを普通に 書く、クライアン トはそのプロジェ クト参照から実行 時動的生成
  3. public class TestService : ITestService { // パブリックメソッドがそのままgRPC定義 public async

    UnaryResult<int> Sum(int x, int y) { // async/awaitにも自然に対応 // マジカル技術によりasync Task<T>じゃなくてもawait可能 await Task.Yield(); return x + y; } } // 普通のgRPCの接続を作る(MagicOnion用の特別なことはない) var channel = new Channel("127.0.0.1:12345"); // 自然な書き味で、タイプセーフにRPC通信を実現 // C#のasync/await構文により、非同期通信も自然に見える var client = MagicOnionClient.Create<ITestService>(channel); var result = await client.Sum(100, 200); struct DynamicTuple { public int item1; public int item2; }
  4. gRPC IN(byte[]) gRPC OUT(byte[]) RPC Method MagicOnion Filters IDL Less

    HandlerSelector MessagePack(with LZ4) Deserialize MessagePack(with LZ4) Serialize
  5. // 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 */ } } }
  6. var thread = GameLoopThreadPool.GetThread(); while (true) { var shouldContinue =

    frameAction(this); if (!shouldContinue) break; await thread.NextFrame(); }