SlideShare a Scribd company logo
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 !!

More Related Content

What's hot

Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
onozaty
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
Takuya Ueda
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
CODE BLUE
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築
Tomocha Potter
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
Mitsutoshi Kiuchi
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
NTT DATA Technology & Innovation
 

What's hot (20)

Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 

Viewers also liked

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
PrometheusPrometheus
Prometheus
Seiya Mizuno
 
Google Protocol Buffers
Google Protocol BuffersGoogle Protocol Buffers
Google Protocol Buffers
Sergey Podolsky
 
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 Buffers
Seiya Mizuno
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
Masahito Zembutsu
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
Masahito Zembutsu
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

Viewers also liked (11)

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
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
忙しい人の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の実践
 

Similar to Protocol Buffers 入門

Python32 pyhackathon-201011
Python32 pyhackathon-201011Python32 pyhackathon-201011
Python32 pyhackathon-201011
Toru Furukawa
 
CpawCTF 勉強会 Network
CpawCTF 勉強会 NetworkCpawCTF 勉強会 Network
CpawCTF 勉強会 Network
Takaaki 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
 
Ssmjp20131031
Ssmjp20131031Ssmjp20131031
Ssmjp20131031
Takashi Naito
 
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
Taisuke Yamada
 
130522 rt講習会(説明用)
130522 rt講習会(説明用)130522 rt講習会(説明用)
130522 rt講習会(説明用)openrtm
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
hakugakucafe
 
NAO/Pepper 開発環境 について
NAO/Pepper 開発環境 についてNAO/Pepper 開発環境 について
NAO/Pepper 開発環境 について
Takuji Kawata
 
200923 01jp
200923 01jp200923 01jp
200923 01jp
openrtm
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
Kentaro Ebisawa
 
開発から見た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
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/Macクロスコンパイル
Tomonori Ohba
 

Similar to 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ミドルウエア講習会・名城大
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/Macクロスコンパイル
 

Recently uploaded

NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
yamamotominami
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
Yoshitaka Kawashima
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
fisuda
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
ooishi1
 
20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
Ayachika Kitazaki
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 

Recently uploaded (7)

NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
 
Grokking Simplicity探訪
Grokking Simplicity探訪Grokking Simplicity探訪
Grokking Simplicity探訪
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 4.0.0対応)
 
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
受発注バスターズ説明資料  株式会社batton Saleshub掲載用.pdf
 
20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf20240603_SD輪読&座談会#57_kitazaki_______.pdf
20240603_SD輪読&座談会#57_kitazaki_______.pdf
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 

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