zeroformatter/magiconion - fastest c# serializer/grpc based c# rpc

31

Upload: yoshifumi-kawai

Post on 06-Jan-2017

8.510 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Page 2: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

Work

C#

Unity

Private

http://neue.cc/

@neuecc

https://github.com/neuecc/UniRx

Page 3: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

Message Format

Page 4: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

XML

JSON

Protocol Buffers

MsgPack

Thrift

Avro

FlatBuffers

Cap’n Proto

Page 5: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Page 6: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

パフォーマンス #とは

その他

Page 7: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

遅い、(特に)(古い)Android遅い...

Page 8: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

遅い、(特に)(古い)Android遅い...

Page 9: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Page 10: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

秘訣は...

Page 11: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Page 12: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

無限大高速なシリアライザ

https://github.com/neuecc/ZeroFormatter/

シリアライズも速い

Page 13: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

無限大高速なシリアライザ

https://github.com/neuecc/ZeroFormatter/

シリアライズも速い

Page 14: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

アクセサーとしてのオブジェクト

Page 15: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

全部は必要ない

Page 16: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

C#自体をスキーマとみなす

Page 17: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

継承みたいなやつをネイティブサポート

[Union(typeof(Human), typeof(Monster))]public interface ICharacter{

[UnionKey]int TypeId { get; }

}

public class Human : ICharacter{

public int TypeId => 0;}

public class Monster : ICharacter{

public int TypeId => 1;}

Page 18: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

Welcome to contribute!

Rubyhttps://github.com/aki017/zero_formatter

Swifthttps://github.com/yaslab/ZeroFormatter.swift

Page 19: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

RPC

Page 20: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

言語の違うREST

Response型を別々に書く

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

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

構成)

Page 21: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

言語の違うREST

Response型を別々に書く

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

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

構成)

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

(←を嫌う時によくある構成、一番メジャー)

Page 22: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

自動生成はダルい

自動化は(必ずしも)よくない

Page 23: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

言語の違うREST

Response型を別々に書く

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

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

構成)

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

(←を嫌う時によくある構成、一番メジャー)

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

共有

Page 24: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

言語の違うREST

Response型を別々に書く

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

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

構成)

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

(←を嫌う時によくある構成、一番メジャー)

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

共有

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

Page 25: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

gRPC based C# Network Framework

gRPCの性能や安定性 + C#的な使いやすさ

Page 26: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

public class TestService : MagicOnionService{

// ふつーにpublicメソッドを定義するだけpublic async Task<int> Sum(int x, int y){

return x + y;}

public async Task<string> Download(string url){

// 非同期もasync/await構文で同期的にOKvar result = await new HttpClient().GetStringAsync(url);return result;

}}

// ふつーのgRPCのコネクションvar channel = new Channel("127.0.0.1:12345");

// .Service<T>でクライアントが実行時動的生成されてシームレスに呼び出し可能var result = await new MagicOnionClient(channel).Service<TestService>().Sum(100, 200);

struct ZeroFormatter$AutoGenerate$1{

public int x;public int y;

}

Page 27: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

gRPC IN(byte[])

gRPC OUT(byte[])

RPC Method

Middleware

IDL Less HandlerSelector

HTTP1 Gateway

Swagger

SerializerSelector(ZeroFormatter, JSON)

Page 28: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

機能

Page 29: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

Conclusion

Page 30: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

C#で統一することの強み言語単体で優劣を語ってもそこまで意味はない

XはY言語だから出来た!という話は、大抵は別にPHPでもCでもなんでも、普通に出来る次元の話がほとんど。特に関数型言語の人に多い話な気もしますが

が、システム全体で統一していくことにより、強みを乗算する

単一であることの弱みは当然ある(No Silver Bullet)が、それを遥かに勝る強みを作っていくことで最高の環境にしていきたい(Windows Serverに対するコダワリはないのでLinuxでは動かしたい!)

パフォーマンスは最大の機能ZeroFormatterもMagicOnionも、それを最も強く意識してる

Page 31: ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC

using