「黒騎士と白の魔王」grpcによるhttp/2 - api, streamingの実践

53

Upload: yoshifumi-kawai

Post on 21-Jan-2018

45.378 views

Category:

Technology


0 download

TRANSCRIPT

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

河合宜文 / Kawai Yoshifumi / @neuecc

C#

Unity

株式会社グラニhttp://grani.jp/

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

gRPC + AWS

gRPC Application - API Service/Realtime Server

Monitoring and Tools

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

gRPC + AWS

gRPC Application - API Service/Realtime Server

Monitoring and Tools

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

iOS/Android用のモバイルRPG

リアルタイムバトル

C#

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

gRPCWhat

Why

How

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

gRPCはHTTP/2ベースのRPC

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

GoogleによるオープンソースRPC実装

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

2種のフレームワークの統合

Unity用リアルタイム通信のスタンダード

勿論、パフォーマンスへの期待

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

C#版のgRPCはある、Unity版はない

移植 + 高レベルフレームワークを作成https://github.com/grani/gRPC

https://github.com/neuecc/MagicOnion

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

C#版のgRPCはある、Unity版はない

移植 + 高レベルフレームワークを作成https://github.com/grani/gRPC

https://github.com/neuecc/MagicOnion

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

リリース!

プロジェクト始動!

当時はWebSocket(C#)

でリアルタイム通信

gRPCプロジェクト始動!

Unity用のgRPCは存在しないので

Unity + iOS/Androidで動くよう移植から

スタート(つまり動くかも未検証)

この辺でWeb APIも含めて

完全移行完了(ギリギリ某ネットワークミドルウェアに

リアルタイム通信を載せかえる、

Web APIはHTTP/1で継続

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

with AWS

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

Service2

BattleEngine

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

Service2

BattleEngine

Page 18: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 19: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 20: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 21: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 22: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 23: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 24: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

Service2 - ELB(TCP)

BattleEngine - Lambda

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

デプロイでリクエストぷちっと切れる問題

Draining and Client Disconnect

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

Make gRPC Application

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

using

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

ようはConsole Application(not IIS)

with HTTP/1

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

ようはConsole Application(not IIS)

with HTTP/1

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

gRPC based HTTP/2 RPC Streaming Frameworkhttps://github.com/neuecc/MagicOnion

https://github.com/neuecc/MessagePack-CSharp/

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

gRPC based HTTP/2 RPC Streaming Frameworkhttps://github.com/neuecc/MagicOnion

https://github.com/neuecc/MessagePack-CSharp/

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

言語の違うREST

Response型を別々に書く

APIクライアントを手書きする

(ザ・マイクロサービスみたいな

構成)

中間IDLを書くそこからクライアント・レスポンス

型自動生成

(←を嫌う時によくある構成、一番

メジャー)

サービスを普通に書く、そこからクライアントを自動生成、リクエスト・レスポンス型はC#のDLLとして

共有

サービスを普通に書く、クライアントはそのプロジェクト参照から実行

時動的生成

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

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の実践

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の実践

// 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の実践
Page 37: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

開発環境用API実行機

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

InMemory BattleEngine

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

var thread = GameLoopThreadPool.GetThread();

while (true){

var shouldContinue = frameAction(this);if (!shouldContinue) break;

await thread.NextFrame();}

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

Monitoring and Tools

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

https://www.datadoghq.com/

SaaS形式のモニタリングサービス

「黒騎士と白の魔王」ではアプリケーション/インフラ双方とも、全てのモニタリングをDatadogのみに集約

Page 44: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 45: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 46: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Page 47: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

全モニタリングをDatadogに集約DevもOpsも、同じダッシュボードをみて多角的な指標で監視

インフラ指標だけではなく、アプリケーション指標も送ることで、DevやOpsを問わず同じ画面で状況を把握できる

「ヴァルハラゲート」の時と比べて、世代が一つ上がった

手でアプリケーション側から埋める自動プロファイリングは便利だけど、大枠の情報に限られる

最も可視化したいアプリケーション固有データをDatadogへ

より高速に、より柔軟に仕込むためDatadogクライアントを作成

https://github.com/neuecc/DatadogSharp

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

全モニタリングを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の実践
Page 50: 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践

Conclusion

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

「最高の」単一テクノロジに集約するMicroservices的ではあるが、分散しすぎない工夫を目指している

単一であることの複雑さの上昇と、分散による複雑さの上昇

その最適なバランスをC#とgRPCによって見つけていく

gRPCもHTTP/2も発展途上特にHTTP/2はツール類がまだまだ途上

しかし、それは数年で解消されるだろう

HTTP/2もgRPCも「使われていくこと」によるコミュニティの知見の蓄積、ツールの成熟が将来的に大きなメリットになっていく

グラニも積極的に知見をシェアし、盛り上がりに貢献していきたい

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

Hiringhttp://recruit.grani.jp/

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