Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
4.1.3 ThriftとProtocol Buffers
Search
koyamaso
April 22, 2021
0
35
4.1.3 ThriftとProtocol Buffers
「データ指向アプリケーションデザイン」輪講資料
koyamaso
April 22, 2021
Tweet
Share
More Decks by koyamaso
See All by koyamaso
9.4.3 耐障害性を持つ合意
koyamaso
0
16
5.4 リーダーレスレプリケーション
koyamaso
0
110
spack.yamlを書こう
koyamaso
0
66
Raft 文献調査
koyamaso
0
160
主専攻実験S-3 メタヒューリスティクスと巡回セールスマン問題 最終発表
koyamaso
0
350
Featured
See All Featured
Scaling GitHub
holman
457
140k
Building an army of robots
kneath
300
41k
How STYLIGHT went responsive
nonsquared
92
4.8k
4 Signs Your Business is Dying
shpigford
176
21k
Building Effective Engineering Teams - LeadDev
addyosmani
33
1.9k
What's new in Ruby 2.0
geeforr
338
31k
Automating Front-end Workflow
addyosmani
1357
200k
Designing on Purpose - Digital PM Summit 2013
jponch
111
6.5k
Writing Fast Ruby
sferik
622
60k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
20
1.8k
What the flash - Photography Introduction
edds
64
11k
Transcript
データ指向 アプリケーションデザイン 4.1.3 ThriftとProtocol Buffers
Apache Thrift https://thrift.apache.org/ 「スケーラブルな言語間サービス開発」のためにFacebookにて開発された 遠隔手続き呼び出し (RPC) フレームワーク .thriftファイルにRPCを定義し、それをもとにやり取りする 対応言語: C++,
Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. 今回はサーバをNodejs,クライアントをRustにしてping pongしてみる
.thrift ファイルを書き、コードを生成 コード生成(Rust) コード生成(Nodejs)
Thriftのネットワークスタック - Protocol 例: Binary,Compact, JSON - Transport 例: Buffered,
Framed
実装 protocolとtransportを揃える
Protocol: Binary, Transport: Buffered
Protocol: Binary, Transport: Framed
Protocol: Compact, Transport: Framed
82 21 02 04 70 69 6e 67 18 04
70 69 6e 67 00 4文字 Compact Protocolでエンコードされたものを読む 第一引数”ping”“\0” 終端を表す 4文字 rpc名”ping” 0 0 0 1 1 0 0 0 フィールドタグ1 種類8(文字列)
スキーマの進化と互換性 スキーマで重要なものは - rpcの名前 - フィールドタグ番号とその型 だとわかった 前方互換性及び後方互換性を保ったままスキーマを変更したい 前方互換性 :古い製品がより新しい製品の機能やデータ形式を扱うことができること
後方互換性 :新しい製品が古い製品の機能やデータ形式を扱うことができること
フィールドタグとスキーマの進化 必須ではない(もしくは初期値が設定できる)フィールドを追加すればよい そのフィールドには新しいフィールドタグ番号を割り当てる - 古いシステムが新しいスキーマを読む場合(前方互換性) 知らないフィールドタグ番号はスキップされるので問題ない - 新しいシステムが古いスキーマを読む場合(後方互換性) 新しいフィールドは必須ではないので問題ない
データ型とスキーマの進化 Thriftのドキュメントを調べた限り 型を変更してもキャストされるとは書いていないので、 スキーマの型を変更するのはやめたほうがよさそう 新しいフィールドタグ番号を割り当てた、別のフィールドを用意したほうが良い
Appendix 以降、Protocol Buffers ( https://developers.google.com/protocol-buffers/ )の説明 gRPC ( https://grpc.io/ )
はProtocol Buffersを使うRPCフレームワーク gRPCは比較的有名なフレームワークだが、今回は紹介せず、 Protocol Buffers のみ紹介する
Protocol Buffers https://developers.google.com/protocol-buffers 構造化されたデータを シリアライズ・デシリアライズするライブラリ .protoファイルに構造化されたデータを記述する Goの場合 を実行してコードを生成する
Protocol Buffersを使ったシリアライズ 実行結果 “Taro” “
[email protected]
” 1 4 13 0 0
0 0 1 0 1 0 フィールドタグ1 種類2(文字列)