「黒騎士と白の魔王」grpcによるhttp/2 - api, streamingの実践
TRANSCRIPT
![Page 1: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/1.jpg)
![Page 2: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/2.jpg)
![Page 4: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/4.jpg)
gRPC + AWS
gRPC Application - API Service/Realtime Server
Monitoring and Tools
![Page 5: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/5.jpg)
gRPC + AWS
gRPC Application - API Service/Realtime Server
Monitoring and Tools
![Page 6: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/6.jpg)
![Page 7: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/7.jpg)
iOS/Android用のモバイルRPG
リアルタイムバトル
C#
![Page 8: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/8.jpg)
gRPCWhat
Why
How
![Page 9: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/9.jpg)
gRPCはHTTP/2ベースのRPC
![Page 10: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/10.jpg)
GoogleによるオープンソースRPC実装
![Page 11: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/11.jpg)
2種のフレームワークの統合
Unity用リアルタイム通信のスタンダード
勿論、パフォーマンスへの期待
![Page 12: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/12.jpg)
C#版のgRPCはある、Unity版はない
移植 + 高レベルフレームワークを作成https://github.com/grani/gRPC
https://github.com/neuecc/MagicOnion
![Page 13: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/13.jpg)
C#版のgRPCはある、Unity版はない
移植 + 高レベルフレームワークを作成https://github.com/grani/gRPC
https://github.com/neuecc/MagicOnion
![Page 14: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/14.jpg)
リリース!
プロジェクト始動!
当時はWebSocket(C#)
でリアルタイム通信
gRPCプロジェクト始動!
Unity用のgRPCは存在しないので
Unity + iOS/Androidで動くよう移植から
スタート(つまり動くかも未検証)
この辺でWeb APIも含めて
完全移行完了(ギリギリ某ネットワークミドルウェアに
リアルタイム通信を載せかえる、
Web APIはHTTP/1で継続
![Page 15: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/15.jpg)
with AWS
![Page 16: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/16.jpg)
Service2
BattleEngine
![Page 17: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/17.jpg)
Service2
BattleEngine
![Page 18: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/18.jpg)
![Page 19: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/19.jpg)
![Page 20: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/20.jpg)
![Page 21: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/21.jpg)
![Page 22: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/22.jpg)
![Page 23: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/23.jpg)
![Page 24: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/24.jpg)
Service2 - ELB(TCP)
BattleEngine - Lambda
![Page 25: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/25.jpg)
デプロイでリクエストぷちっと切れる問題
Draining and Client Disconnect
![Page 26: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/26.jpg)
Make gRPC Application
![Page 27: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/27.jpg)
using
![Page 28: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/28.jpg)
ようはConsole Application(not IIS)
with HTTP/1
![Page 29: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/29.jpg)
ようはConsole Application(not IIS)
with HTTP/1
![Page 30: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/30.jpg)
gRPC based HTTP/2 RPC Streaming Frameworkhttps://github.com/neuecc/MagicOnion
https://github.com/neuecc/MessagePack-CSharp/
![Page 31: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/31.jpg)
gRPC based HTTP/2 RPC Streaming Frameworkhttps://github.com/neuecc/MagicOnion
https://github.com/neuecc/MessagePack-CSharp/
![Page 32: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/32.jpg)
言語の違うREST
Response型を別々に書く
APIクライアントを手書きする
(ザ・マイクロサービスみたいな
構成)
中間IDLを書くそこからクライアント・レスポンス
型自動生成
(←を嫌う時によくある構成、一番
メジャー)
サービスを普通に書く、そこからクライアントを自動生成、リクエスト・レスポンス型はC#のDLLとして
共有
サービスを普通に書く、クライアントはそのプロジェクト参照から実行
時動的生成
![Page 33: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/33.jpg)
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;
}
![Page 34: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/34.jpg)
gRPC IN(byte[])
gRPC OUT(byte[])
RPC Method
MagicOnion Filters
IDL Less HandlerSelector
MessagePack(with LZ4) Deserialize
MessagePack(with LZ4) Serialize
![Page 35: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/35.jpg)
// 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 */}
}}
![Page 36: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/36.jpg)
![Page 37: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/37.jpg)
開発環境用API実行機
![Page 38: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/38.jpg)
InMemory BattleEngine
![Page 39: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/39.jpg)
![Page 40: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/40.jpg)
![Page 41: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/41.jpg)
var thread = GameLoopThreadPool.GetThread();
while (true){
var shouldContinue = frameAction(this);if (!shouldContinue) break;
await thread.NextFrame();}
![Page 42: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/42.jpg)
Monitoring and Tools
![Page 43: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/43.jpg)
https://www.datadoghq.com/
SaaS形式のモニタリングサービス
「黒騎士と白の魔王」ではアプリケーション/インフラ双方とも、全てのモニタリングをDatadogのみに集約
![Page 44: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/44.jpg)
![Page 45: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/45.jpg)
![Page 46: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/46.jpg)
![Page 47: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/47.jpg)
全モニタリングをDatadogに集約DevもOpsも、同じダッシュボードをみて多角的な指標で監視
インフラ指標だけではなく、アプリケーション指標も送ることで、DevやOpsを問わず同じ画面で状況を把握できる
「ヴァルハラゲート」の時と比べて、世代が一つ上がった
手でアプリケーション側から埋める自動プロファイリングは便利だけど、大枠の情報に限られる
最も可視化したいアプリケーション固有データをDatadogへ
より高速に、より柔軟に仕込むためDatadogクライアントを作成
https://github.com/neuecc/DatadogSharp
![Page 48: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/48.jpg)
全モニタリングをDatadogに集約DevもOpsも、同じダッシュボードをみて多角的な指標で監視
インフラ指標だけではなく、アプリケーション指標も送ることで、DevやOpsを問わず同じ画面で状況を把握できる
「ヴァルハラゲート」の時と比べて、世代が一つ上がった
手でアプリケーション側から埋める自動プロファイリングは便利だけど、大枠の情報に限られる
最も可視化したいアプリケーション固有データをDatadogへ
より高速に、より柔軟に仕込むためDatadogクライアントを作成
https://github.com/neuecc/DatadogSharp
http://engineering.grani.jp/entry/2017/05/29/173141
![Page 49: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/49.jpg)
![Page 50: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/50.jpg)
Conclusion
![Page 51: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/51.jpg)
「最高の」単一テクノロジに集約するMicroservices的ではあるが、分散しすぎない工夫を目指している
単一であることの複雑さの上昇と、分散による複雑さの上昇
その最適なバランスをC#とgRPCによって見つけていく
gRPCもHTTP/2も発展途上特にHTTP/2はツール類がまだまだ途上
しかし、それは数年で解消されるだろう
HTTP/2もgRPCも「使われていくこと」によるコミュニティの知見の蓄積、ツールの成熟が将来的に大きなメリットになっていく
グラニも積極的に知見をシェアし、盛り上がりに貢献していきたい
![Page 53: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践](https://reader033.vdocuments.mx/reader033/viewer/2022050613/5a6479307f8b9a31568b46ff/html5/thumbnails/53.jpg)