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
45
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
24
5.4 リーダーレスレプリケーション
koyamaso
0
160
spack.yamlを書こう
koyamaso
0
81
Raft 文献調査
koyamaso
0
170
主専攻実験S-3 メタヒューリスティクスと巡回セールスマン問題 最終発表
koyamaso
0
380
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
What's in a price? How to price your products and services
michaelherold
246
12k
Testing 201, or: Great Expectations
jmmastey
42
7.6k
How to Ace a Technical Interview
jacobian
277
23k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
800
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Designing Experiences People Love
moore
142
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
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(文字列)