SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
Protocol Buffers 入門
伊藤 裕一 (Yuichi110)
Agenda
• 分散システムと Protocol Buffers
• Protocol Buffers の簡単な使い方
• Json などの従来技術との比較
• Protocol Buffers で RPC を実現する
• Q & A
2
自己紹介
• 伊藤裕一 (twitter: yuichi110)
• - 2016 : Cisco データセンタースイッチ (ネットワーク屋)
• 2016 - : Nutanix ハイパーコンバージド�(サーバー屋)
• 趣味でコード書いたり。。。
3
最近 MyNavi での連載が終了
全36回(2015/05/25 - 2016/02/04)
4
Protocol Buffers from Google
Protocol buffers are a language-neutral, platform-neutral
extensible mechanism for serializing structured data.
分散システム
• 複数の「ノード」が連携してシステムとなる
• ノードがダウンしても他のノードが処理を継続
5
Node Node Node Node
Distributed
System
Switch Switch
有名な分散システム
• SaaS (Google のサービス系)
• スパコンの対極
6
Cheap Server Cluster
ノード間の連携
• クラスタのノード間の通信は TCP/IP ネットワーク経由
• パケットのペイロードにシステムの情報をのせる
7
Node A Node B
Packet
Packet
mac | ip | tcp | payload (data)
今日はここの話 !!
Protocol Buffers�で何ができる ? (1)
• データをシリアライズ化するフォーマット
• 入力データをシリアライズ化して圧縮
• 圧縮されたデータをデシリアライズ(解凍)化して戻す
8
structured data serialized data
serialized data structured data
Serializer
Protocol Buffers
De-Serializer
Protocol Buffers
Protocol Buffers�で何ができる ? (2)
• RPC (Remote Procedure Call) のフレームワーク
• 内部的にシリアライズ・デシリアライズを利用
9
Node A
Client
Node B
Server
RPC を定義: add(int x, int y) -> int z
call : add(1,2)
return : 3 calc : 1 + 2 -> 3
Agenda
• 分散システムと Protocol Buffers
• Protocol Buffers の簡単な使い方
• Json などの従来技術との比較
• Protocol Buffers で RPC を実現する
• Q & A
10
Protocol Buffer を利用する流れ
• プロトコルを定義したファイルを作成
• ファイルをコンパイルしてコードを生成
• そのコードを使ってシリアライズ/デシリアライズ/RPC
11
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
Language
Language structure is similar to Java or C++
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
Language
message is a small logical record of information
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
repeated PhoneNumber phone = 4;
}
Language
message has numbered fields
each field has a name and a value type
Field Number
Field Name
Field Value Type
numbers (integer or floating-point),
booleans, strings, raw bytes, etc
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
Language
can use other protocol buffer message as value type
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
Language
field type : required, optional, repeated
Language
• その他多数の機能
• import
• extend
• service (後述)
• map etc
• 詳細は Language Guide にて
17
.proto file のコンパイル
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/FILE_NAME
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
addressbook.proto (定義)
protoc --python_out=./ ./addressbook.proto
コンパイル
addressbook_pb2.py (コード)
.proto file のコンパイル
• protoc のオプションで言語を選択
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR path/to/file.proto
--java_out=DST_DIR
--python_out=DST_DIR
他の言語もコンパイラが存在している
生成コードをロードしてみる
20
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import addressbook_pb2
>>> dir(addressbook_pb2)
['AddressBook', 'DESCRIPTOR', 'Person', '_ADDRESSBOOK', '_PERSON',
'_PERSON_PHONENUMBER', '_PERSON_PHONETYPE', '__builtins__', '__doc__',
'__file__', '__name__', '__package__', '_b', '_descriptor', '_message',
'_reflection', '_sym_db', '_symbol_database', 'descriptor_pb2', 'sys']
>>> dir(addressbook_pb2.Person)
['ByteSize', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DESCRIPTOR',
'EMAIL_FIELD_NUMBER', 'FindInitializationErrors', 'FromString', 'HOME',
'HasExtension', 'HasField', 'ID_FIELD_NUMBER', 'IsInitialized', 'ListFields',
'MOBILE', 'MergeFrom', 'MergeFromString', 'NAME_FIELD_NUMBER',
'PHONE_FIELD_NUMBER', 'ParseFromString', 'PhoneNumber', ‘PhoneType',
…
’_decoders_by_tag’, '_extensions_by_name', '_extensions_by_number', '_fields',
'_is_present_in_parent', '_listener', '_listener_for_children', '_oneofs',
'_unknown_fields', 'email', 'id', 'name', 'phone']
addressbook.proto をコンパイル
ファイル名がパッケージに
message がクラスに
フィールドが変数に
コードでデータをシリアライズ/デシリアライズ
21
>>> person = addressbook_pb2.Person()
>>> person.id = 1234
>>> person.name = "Jon Doe"
>>> person.email = “jdoe@example.com"
>>> person.SerializeToString()
'nx07Jon Doex10xd2tx1ax10jdoe@example.com’
シリアライズ
>>> person2 = addressbook_pb2.Person()
>>> person2.ParseFromString("nx07Jon Doex10xd2tx1ax10jdoe@example.com")
>>> person2.name
u'Jon Doe'
デシリアライズ
payload にのせてやりとり
Agenda
• 分散システムと Protocol Buffers
• Protocol Buffers の簡単な使い方
• Json などの従来技術との比較
• Protocol Buffers で RPC を実現する
• Q & A
22
XML/JSON の復習
23
<employees>
<employee>
<firstName>John</firstName> <lastName>Doe</lastName>
</employee>
<employee>
<firstName>Anna</firstName> <lastName>Smith</lastName>
</employee>
<employee>
<firstName>Peter</firstName> <lastName>Jones</lastName>
</employee>
</employees>
XML
Mark up
{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
JSON
Key and Value
XML/JSON を使ったデータの受け渡し
24
Node A Node B
Packet
XML/JSON writer
Structured Data
XML/JSON parser
Structured Data
Object Object
socket, REST etc
ユーザがオブジェクトとXML/JSONのマッピング
Protocol buffers を使ったデータの受け渡し
Node A Node B
Packet
serialize
(protobuf)
Structured Data
(protobuf)
de-serialize
(protobuf)
Structured Data
(protobuf)
Binary
Object Object
Binary
socket, REST etc
クラスの利用でオブジェクトのマッピングが不要
Protobuf が JSON/XML に勝る点
• reader/writer の処理を自分で書かなくて良い
• 読み書きの処理速度に優れる
• コード変更時のバグが少ない
• データ量が減るため通信が高速化
• 第三者への難読化
26
Protobuf が JSON/XML に劣る点
• protocol buffers のインストールが必要
• ブラウザなどを通した「外部」からの利用には向いていない
• サービスの「内部」での利用がメイン
• 小さいデータのやりとりには手間がかかりすぎる
27
Protobuf が JSON/XML と共通
• データをどう表現するかという「フォーマット」
• REST などの「コミュニケーション手段」とは別
28
Agenda
• 分散システムと Protocol Buffers
• Protocol Buffers の簡単な使い方
• Json などの従来技術との比較
• Protocol Buffers で RPC を実現する
• Q & A
29
Nutanix での実利用例
30
仮想化に SAN, ストレージが不要
Nutanix での実利用例
31
Host A Host B Host C
VM1 VM2 VM3 VM4 VM5 VM6
Storage (Hyper Converged)
Nutanix Cluster
Browser
power off vm 6
Prism
Web Server
Browser click power off button on vm 6
Prism
Web Server
Prism
Web Server
Acropolis
VM Management
Acropolis
VM Management
Acropolis
VM Management
AHV
HyperVisor
AHV
HyperVisor
AHV
HyperVisor
Node A Node B Node C
Controller
Host
Master
run the VM6Protobuf
rest
Nutanix での実利用例
33
…
機能 A
汎用 proto
機能 B
make class
class
class
…
egg file
合体
Nutanix での実利用例
34
Order 1
Order 2
Order 3
GeneralRPCUtility(protobuf)
rest +
protobuf
From
Order 1
Order 2
Order 3
Pythonwebserver
To
OtherComponentsTheComponent
ProtobufServ
Acropolis Acropolis
Nutanix での実利用例
RPC の実現 (1)
• .proto file に RPC を定義
• RPC名(services)、引数(message)、返り値(message)
• クライアント : 生成された RPC の呼び出し
• サーバー : 届けられたデータをデシリアライズし返り値を返す
35
message searchRequest {}
message searchResponse {}
service searchService {
rpc Search (ServiceRequest) returns (SearchResponse);
}
search.proto
Node A Node B
message A
call RPC
Structured Data
(message A)
de-serialize
Binary
Object Object
Binary
Structured Data
(message A)
messageB
get RPC result
Structured Data
(message B)
Binary
Structured Data
(message B)
Binary
serialize
Object
implementation
Object
Node A Node B
request
call RPC
Structured Data
(message A)
de-serialize
Binary
Object Object
Binary
Structured Data
(message A)
response
get RPC result
Structured Data
(message B)
Binary
Structured Data
(message B)
Binary
serialize
Object
implementation
Object
service
RPCのためのクラス
• RpcController : 継承して細かい挙動の定義
• RpcChannel : 継承して RPC 通信の方法を実装
• Service�Class : .proto file から生成されて上記を利用
38
1. Controller, Channel を用意
2. Serviceクラスをインスタンス化
3. 上記インスタンスにRPC引数等を渡す
4. RPCの結果はコールバック等で受け取る
言語により若干の違いあり
詳細は公式ドキュメント等にて
Agenda
• 分散システムと Protocol Buffers
• Protocol Buffers の簡単な使い方
• Json などの従来技術との比較
• Protocol Buffers で RPC を実現する
• Q & A
39
Thank you !!

Weitere ähnliche Inhalte

Was ist angesagt?

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409稔 小林
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけらAtsushi Nakamura
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったことRecruit Technologies
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をするjiro4989
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 

Was ist angesagt? (20)

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 

Andere mochten auch

NSQ-Centric Architecture (GoCon Autumn 2014)
NSQ-Centric Architecture (GoCon Autumn 2014)NSQ-Centric Architecture (GoCon Autumn 2014)
NSQ-Centric Architecture (GoCon Autumn 2014)guregu
 
Prometheus (Prometheus London, 2016)
Prometheus (Prometheus London, 2016)Prometheus (Prometheus London, 2016)
Prometheus (Prometheus London, 2016)Brian Brazil
 
Connect S3 with Kafka using Akka Streams
Connect S3 with Kafka using Akka Streams Connect S3 with Kafka using Akka Streams
Connect S3 with Kafka using Akka Streams Seiya Mizuno
 
Prometheus 監視で変わるもの
Prometheus 監視で変わるものPrometheus 監視で変わるもの
Prometheus 監視で変わるものTakehiro Sugita
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春VerMasahito Zembutsu
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 

Andere mochten auch (10)

NSQ-Centric Architecture (GoCon Autumn 2014)
NSQ-Centric Architecture (GoCon Autumn 2014)NSQ-Centric Architecture (GoCon Autumn 2014)
NSQ-Centric Architecture (GoCon Autumn 2014)
 
Prometheus
PrometheusPrometheus
Prometheus
 
Google Protocol Buffers
Google Protocol BuffersGoogle Protocol Buffers
Google Protocol Buffers
 
Prometheus (Prometheus London, 2016)
Prometheus (Prometheus London, 2016)Prometheus (Prometheus London, 2016)
Prometheus (Prometheus London, 2016)
 
Connect S3 with Kafka using Akka Streams
Connect S3 with Kafka using Akka Streams Connect S3 with Kafka using Akka Streams
Connect S3 with Kafka using Akka Streams
 
Prometheus 監視で変わるもの
Prometheus 監視で変わるものPrometheus 監視で変わるもの
Prometheus 監視で変わるもの
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Ähnlich wie Protocol Buffers 入門

Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011Toru Furukawa
 
CpawCTF 勉強会 Network
CpawCTF 勉強会 NetworkCpawCTF 勉強会 Network
CpawCTF 勉強会 NetworkTakaaki Hoyo
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大openrtm
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3openrtm
 
Robomec2014 rtm講習会第2部
Robomec2014 rtm講習会第2部Robomec2014 rtm講習会第2部
Robomec2014 rtm講習会第2部openrtm
 
URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!treby
 
TurtleBot3でROSを始めよう
TurtleBot3でROSを始めようTurtleBot3でROSを始めよう
TurtleBot3でROSを始めようROBOTIS Japan
 
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜Hideki Takase
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdTaisuke Yamada
 
130522 rt講習会(説明用)
130522 rt講習会(説明用)130522 rt講習会(説明用)
130522 rt講習会(説明用)openrtm
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
NAO/Pepper 開発環境 について
NAO/Pepper 開発環境 についてNAO/Pepper 開発環境 について
NAO/Pepper 開発環境 についてTakuji Kawata
 
200923 01jp
200923 01jp200923 01jp
200923 01jpopenrtm
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能Tadahiro Ishisaka
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大openrtm
 

Ähnlich wie Protocol Buffers 入門 (20)

Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011
 
CpawCTF 勉強会 Network
CpawCTF 勉強会 NetworkCpawCTF 勉強会 Network
CpawCTF 勉強会 Network
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3
 
Robomec2014 rtm講習会第2部
Robomec2014 rtm講習会第2部Robomec2014 rtm講習会第2部
Robomec2014 rtm講習会第2部
 
URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!
 
TurtleBot3でROSを始めよう
TurtleBot3でROSを始めようTurtleBot3でROSを始めよう
TurtleBot3でROSを始めよう
 
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
 
Ssmjp20131031
Ssmjp20131031Ssmjp20131031
Ssmjp20131031
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
 
130522 rt講習会(説明用)
130522 rt講習会(説明用)130522 rt講習会(説明用)
130522 rt講習会(説明用)
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
NAO/Pepper 開発環境 について
NAO/Pepper 開発環境 についてNAO/Pepper 開発環境 について
NAO/Pepper 開発環境 について
 
200923 01jp
200923 01jp200923 01jp
200923 01jp
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大160705-02 RTミドルウエア講習会・名城大
160705-02 RTミドルウエア講習会・名城大
 

Protocol Buffers 入門

  • 1. Protocol Buffers 入門 伊藤 裕一 (Yuichi110)
  • 2. Agenda • 分散システムと Protocol Buffers • Protocol Buffers の簡単な使い方 • Json などの従来技術との比較 • Protocol Buffers で RPC を実現する • Q & A 2
  • 3. 自己紹介 • 伊藤裕一 (twitter: yuichi110) • - 2016 : Cisco データセンタースイッチ (ネットワーク屋) • 2016 - : Nutanix ハイパーコンバージド�(サーバー屋) • 趣味でコード書いたり。。。 3 最近 MyNavi での連載が終了 全36回(2015/05/25 - 2016/02/04)
  • 4. 4 Protocol Buffers from Google Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.
  • 6. 有名な分散システム • SaaS (Google のサービス系) • スパコンの対極 6 Cheap Server Cluster
  • 7. ノード間の連携 • クラスタのノード間の通信は TCP/IP ネットワーク経由 • パケットのペイロードにシステムの情報をのせる 7 Node A Node B Packet Packet mac | ip | tcp | payload (data) 今日はここの話 !!
  • 8. Protocol Buffers�で何ができる ? (1) • データをシリアライズ化するフォーマット • 入力データをシリアライズ化して圧縮 • 圧縮されたデータをデシリアライズ(解凍)化して戻す 8 structured data serialized data serialized data structured data Serializer Protocol Buffers De-Serializer Protocol Buffers
  • 9. Protocol Buffers�で何ができる ? (2) • RPC (Remote Procedure Call) のフレームワーク • 内部的にシリアライズ・デシリアライズを利用 9 Node A Client Node B Server RPC を定義: add(int x, int y) -> int z call : add(1,2) return : 3 calc : 1 + 2 -> 3
  • 10. Agenda • 分散システムと Protocol Buffers • Protocol Buffers の簡単な使い方 • Json などの従来技術との比較 • Protocol Buffers で RPC を実現する • Q & A 10
  • 11. Protocol Buffer を利用する流れ • プロトコルを定義したファイルを作成 • ファイルをコンパイルしてコードを生成 • そのコードを使ってシリアライズ/デシリアライズ/RPC 11
  • 12. message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } Language Language structure is similar to Java or C++
  • 13. message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } Language message is a small logical record of information
  • 14. message Person { required string name = 1; required int32 id = 2; optional string email = 3; repeated PhoneNumber phone = 4; } Language message has numbered fields each field has a name and a value type Field Number Field Name Field Value Type numbers (integer or floating-point), booleans, strings, raw bytes, etc
  • 15. message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } Language can use other protocol buffer message as value type
  • 16. message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } Language field type : required, optional, repeated
  • 17. Language • その他多数の機能 • import • extend • service (後述) • map etc • 詳細は Language Guide にて 17
  • 18. .proto file のコンパイル protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/FILE_NAME package tutorial; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; } addressbook.proto (定義) protoc --python_out=./ ./addressbook.proto コンパイル addressbook_pb2.py (コード)
  • 19. .proto file のコンパイル • protoc のオプションで言語を選択 protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR path/to/file.proto --java_out=DST_DIR --python_out=DST_DIR 他の言語もコンパイラが存在している
  • 20. 生成コードをロードしてみる 20 Python 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import addressbook_pb2 >>> dir(addressbook_pb2) ['AddressBook', 'DESCRIPTOR', 'Person', '_ADDRESSBOOK', '_PERSON', '_PERSON_PHONENUMBER', '_PERSON_PHONETYPE', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_b', '_descriptor', '_message', '_reflection', '_sym_db', '_symbol_database', 'descriptor_pb2', 'sys'] >>> dir(addressbook_pb2.Person) ['ByteSize', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DESCRIPTOR', 'EMAIL_FIELD_NUMBER', 'FindInitializationErrors', 'FromString', 'HOME', 'HasExtension', 'HasField', 'ID_FIELD_NUMBER', 'IsInitialized', 'ListFields', 'MOBILE', 'MergeFrom', 'MergeFromString', 'NAME_FIELD_NUMBER', 'PHONE_FIELD_NUMBER', 'ParseFromString', 'PhoneNumber', ‘PhoneType', … ’_decoders_by_tag’, '_extensions_by_name', '_extensions_by_number', '_fields', '_is_present_in_parent', '_listener', '_listener_for_children', '_oneofs', '_unknown_fields', 'email', 'id', 'name', 'phone'] addressbook.proto をコンパイル ファイル名がパッケージに message がクラスに フィールドが変数に
  • 21. コードでデータをシリアライズ/デシリアライズ 21 >>> person = addressbook_pb2.Person() >>> person.id = 1234 >>> person.name = "Jon Doe" >>> person.email = “jdoe@example.com" >>> person.SerializeToString() 'nx07Jon Doex10xd2tx1ax10jdoe@example.com’ シリアライズ >>> person2 = addressbook_pb2.Person() >>> person2.ParseFromString("nx07Jon Doex10xd2tx1ax10jdoe@example.com") >>> person2.name u'Jon Doe' デシリアライズ payload にのせてやりとり
  • 22. Agenda • 分散システムと Protocol Buffers • Protocol Buffers の簡単な使い方 • Json などの従来技術との比較 • Protocol Buffers で RPC を実現する • Q & A 22
  • 23. XML/JSON の復習 23 <employees> <employee> <firstName>John</firstName> <lastName>Doe</lastName> </employee> <employee> <firstName>Anna</firstName> <lastName>Smith</lastName> </employee> <employee> <firstName>Peter</firstName> <lastName>Jones</lastName> </employee> </employees> XML Mark up {"employees":[ {"firstName":"John", "lastName":"Doe"}, {"firstName":"Anna", "lastName":"Smith"}, {"firstName":"Peter", "lastName":"Jones"} ]} JSON Key and Value
  • 24. XML/JSON を使ったデータの受け渡し 24 Node A Node B Packet XML/JSON writer Structured Data XML/JSON parser Structured Data Object Object socket, REST etc ユーザがオブジェクトとXML/JSONのマッピング
  • 25. Protocol buffers を使ったデータの受け渡し Node A Node B Packet serialize (protobuf) Structured Data (protobuf) de-serialize (protobuf) Structured Data (protobuf) Binary Object Object Binary socket, REST etc クラスの利用でオブジェクトのマッピングが不要
  • 26. Protobuf が JSON/XML に勝る点 • reader/writer の処理を自分で書かなくて良い • 読み書きの処理速度に優れる • コード変更時のバグが少ない • データ量が減るため通信が高速化 • 第三者への難読化 26
  • 27. Protobuf が JSON/XML に劣る点 • protocol buffers のインストールが必要 • ブラウザなどを通した「外部」からの利用には向いていない • サービスの「内部」での利用がメイン • 小さいデータのやりとりには手間がかかりすぎる 27
  • 28. Protobuf が JSON/XML と共通 • データをどう表現するかという「フォーマット」 • REST などの「コミュニケーション手段」とは別 28
  • 29. Agenda • 分散システムと Protocol Buffers • Protocol Buffers の簡単な使い方 • Json などの従来技術との比較 • Protocol Buffers で RPC を実現する • Q & A 29
  • 31. Nutanix での実利用例 31 Host A Host B Host C VM1 VM2 VM3 VM4 VM5 VM6 Storage (Hyper Converged) Nutanix Cluster Browser power off vm 6
  • 32. Prism Web Server Browser click power off button on vm 6 Prism Web Server Prism Web Server Acropolis VM Management Acropolis VM Management Acropolis VM Management AHV HyperVisor AHV HyperVisor AHV HyperVisor Node A Node B Node C Controller Host Master run the VM6Protobuf rest Nutanix での実利用例
  • 33. 33 … 機能 A 汎用 proto 機能 B make class class class … egg file 合体 Nutanix での実利用例
  • 34. 34 Order 1 Order 2 Order 3 GeneralRPCUtility(protobuf) rest + protobuf From Order 1 Order 2 Order 3 Pythonwebserver To OtherComponentsTheComponent ProtobufServ Acropolis Acropolis Nutanix での実利用例
  • 35. RPC の実現 (1) • .proto file に RPC を定義 • RPC名(services)、引数(message)、返り値(message) • クライアント : 生成された RPC の呼び出し • サーバー : 届けられたデータをデシリアライズし返り値を返す 35 message searchRequest {} message searchResponse {} service searchService { rpc Search (ServiceRequest) returns (SearchResponse); } search.proto
  • 36. Node A Node B message A call RPC Structured Data (message A) de-serialize Binary Object Object Binary Structured Data (message A) messageB get RPC result Structured Data (message B) Binary Structured Data (message B) Binary serialize Object implementation Object
  • 37. Node A Node B request call RPC Structured Data (message A) de-serialize Binary Object Object Binary Structured Data (message A) response get RPC result Structured Data (message B) Binary Structured Data (message B) Binary serialize Object implementation Object service
  • 38. RPCのためのクラス • RpcController : 継承して細かい挙動の定義 • RpcChannel : 継承して RPC 通信の方法を実装 • Service�Class : .proto file から生成されて上記を利用 38 1. Controller, Channel を用意 2. Serviceクラスをインスタンス化 3. 上記インスタンスにRPC引数等を渡す 4. RPCの結果はコールバック等で受け取る 言語により若干の違いあり 詳細は公式ドキュメント等にて
  • 39. Agenda • 分散システムと Protocol Buffers • Protocol Buffers の簡単な使い方 • Json などの従来技術との比較 • Protocol Buffers で RPC を実現する • Q & A 39