河合宜文 - d0.awsstatic.com · 当時はwebsocket(c#) でリアルタイム通信...

53

Upload: others

Post on 31-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 2: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 3: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

河合宜文 / Kawai Yoshifumi / @neuecc

C#

Unity

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

Page 4: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

gRPC + AWS

gRPC Application - API Service/Realtime Server

Monitoring and Tools

Page 5: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

gRPC + AWS

gRPC Application - API Service/Realtime Server

Monitoring and Tools

Page 6: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 7: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

iOS/Android用のモバイルRPG

リアルタイムバトル

C#

Page 8: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

gRPCWhat

Why

How

Page 9: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

gRPCはHTTP/2ベースのRPC

Page 10: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

Page 11: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

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

Page 12: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

https://github.com/neuecc/MagicOnion

Page 13: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

https://github.com/neuecc/MagicOnion

Page 14: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

リリース!

プロジェクト始動!

当時はWebSocket(C#)

でリアルタイム通信

gRPCプロジェクト始動!

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

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

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

この辺でWeb APIも含めて

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

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

Web APIはHTTP/1で継続

Page 15: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

with AWS

Page 16: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Service2

BattleEngine

Page 17: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Service2

BattleEngine

Page 18: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 19: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 20: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 21: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 22: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 23: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 24: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Service2 - ELB(TCP)

BattleEngine - Lambda

Page 25: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

Draining and Client Disconnect

Page 26: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Make gRPC Application

Page 27: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

using

Page 28: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

ようはConsole Application(not IIS)

with HTTP/1

Page 29: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

ようはConsole Application(not IIS)

with HTTP/1

Page 30: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

Page 31: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

Page 32: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

言語の違うREST

Response型を別々に書く

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

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

構成)

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

型自動生成

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

メジャー)

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

共有

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

時動的生成

Page 33: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

MagicOnion Filters

IDL Less HandlerSelector

MessagePack(with LZ4) Deserialize

MessagePack(with LZ4) Serialize

Page 35: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

// 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: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 37: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

開発環境用API実行機

Page 38: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

InMemory BattleEngine

Page 39: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 40: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 41: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

var thread = GameLoopThreadPool.GetThread();

while (true){

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

await thread.NextFrame();}

http://engineering.grani.jp/entry/2017/06/02/190012

Page 42: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Monitoring and Tools

Page 43: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

https://www.datadoghq.com/

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

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

Page 44: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 45: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 46: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 47: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

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

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

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

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

https://github.com/neuecc/DatadogSharp

Page 48: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

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

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

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

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

https://github.com/neuecc/DatadogSharp

http://engineering.grani.jp/entry/2017/05/29/173141

Page 49: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から
Page 50: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Conclusion

Page 51: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

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

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

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

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

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

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

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

Page 52: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から

Hiringhttp://recruit.grani.jp/

Page 53: 河合宜文 - d0.awsstatic.com · 当時はWebSocket(C#) でリアルタイム通信 gRPCプロジェクト始動! Unity用のgRPCは存在しないので Unity + iOS/Androidで動くよう移植から