SlideShare a Scribd company logo
1 of 22
Designing Data-Intensive
Applications 4章
輪読会資料
2019年2月 kanda.motohiro@gmail.com 作成。
CC BY-SA 4.0 のもとで公開します
4章は、エンコードと進化
• 後方互換性。新しいコードは、古いデータを読める。
• 前方互換性。古いコードは、新しいデータを読める。
• むつかしい。未来は予測できない。せいぜい、新しく加わった部分を無視できれば
いい。
• メモリ上データ構造から、ネットワークあるいは、ディスク書き込
みすること。encoding, serialization or marshalling
• その逆。decoding, parsing, deserialization,
unmarshalling
言語 固有のシリアライゼーション
java.io.Serializable, Ruby Marshal, Python pickle
などあるけど、問題は、
プログラム言語を混ぜては使えない。
バージョン付けできない。
やはり、標準的なエンコードを使おう。
テキストエンコードか、バイナリか?
テキストエンコード例。 JSON
{
"userName": "Martin",
"favoriteNumber": 1337,
"interests": [" daydreaming", "hacking"]
}
脱線。 C struct を忘れてるだろ
struct record {
char userName[16];
int32_t favoriteNumber;
char interests[16][2]; // 確かにこれは不得意だけど
}
• TCP/IP のヘッダが、 JSON で書いてあったら、
例:“Source Address”: “192.168.0.1”
インターネットは今の10倍、遅かったであろう。
• 本物のプログラミング言語は C メモリイメージを読み書きできる。
struct.unpack() in python (いずれも出典、俺)
テキストエンコードに戻って
•JSON のほかに、 XML, CSV カンマ区切り など
がある。
•スキーマを与えられるものもある。
•長所。人が読める。
•欠点。バイナリエンコードに比べて、バイト数が
長い、解析に CPU をくう。
ならば、JSON/XML をバイナリエンコード
•JSON (MessagePack, BSON, BJSON, UBJSON,
BISON, and Smile)
•XML (WBXML and Fast Infoset)
脱線。Object Relational Mapper を忘れてるだろ
あなたは今どき、手でシリアライズするの?
クラスを書く。
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
}
db コンテキストが必要。
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
}
マイクロソフト Entity Framework
https://docs.microsoft.com/ja-jp/ef/ef6/modeling/code-first/workflows/new-database
using (var db = new BloggingContext())
{
var blog = new Blog { Name = name };
db.Blogs.Add(blog); // INSERT
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
バージョニング可能なエンコード
•Apache Thrift (Facebook) このスライドでは
略。興味ある人は、本を読んで。
•Protocol Buffers (Google protobuf)
•Apache Avro これも略。
•スキーマあり、コード生成あり。
Protocol Buffersスキーマ
message Person {
required string user_name = 1;
optional int64 favorite_number = 2;
repeated string interests = 3;
}
テキストエンコード例。 JSON
{
"userName": "Martin",
"favoriteNumber": 1337,
"interests": [" daydreaming", "hacking"]
}
81バイト。
なんでひっくり返すの?
Protocol Buffers 特徴
• フィールドは、整数のタグを持つ。増減してもわかる。
バージョニング可能。
• 電文長を短くする工夫。33バイト。
• 0 から 127 までの整数は、1バイトで表せる。
• Protocol Buffers のエンコーディング仕様の解説
https://qiita.com/aiueo4u/items/38195248a29e9ff719c7
• gRPC について https://grpc.io/docs/quickstart/
エンコードまとめ
• 固定長で、固定数のフィールドがあればよくて、バイト数と
解析のための CPU 負荷が重要なら、 C struct
• オプショナルなフィールド、バージョニングがほしいなら、各
フィールドにタグをつけるよりない。 Protocol Buffer and
friends
• 人が読める、スクリプト言語で書ける、ことが大事なら、
JSON/XML
• XML > JSON > Protocol Buffer > C struct
• gRPC にしたら10倍速くなりました。個人の感想です。
RPC は滅びぬ!
何度でも蘇るさ!位置を意識しない関数呼び出しこそプログラマの
夢だからだ!(天空の城ラピュタネタ)
Kleppmann, Martin. Designing Data-Intensive
Applications
RPC の歴史
1980年代
• ONC RPC by Sun
• DCE RPC by HP, IBM, DEC, 後に、Microsoft
2019年現在も、前者は、 NFS 実装で、後者は、 SMB 実装で、現役
で動いている。
2000年前後
• EJB, RMI, CORBA, DCOM 聞いたことない?うん、知らないでいいよ。
続く。
RPC の歴史 cont.
•Thrift and Avro は、RPC サポートがある。
•gRPC は、Protocol Buffers を使う。
•Finagle also uses Thrift
•Rest.li uses JSON over HTTP
RPCの問題
• ローカル関数呼び出しに見えても、タイムアウトなど、RPC 固有のハ
ンドリングが必要。
• send/receive C struct でいいじゃん。
• RPC はシンタクティックシュガーで、不完全な抽象化層で、どうでもい
いものを見せて大事なものを隠す。(出典、俺)
• Illusion of transparent RPC は、ほどほどに。
ウェブサービス定義言語
•WSDL for SOAP
•OpenAPI, also
known as Swagger
for REST
http://editor.swagger.io/
paths:
/pet/{petId}:
get:
parameters:
- name: "petId"
type: "integer"
responses:
200:
schema:
$ref: "#/definitions/Pet"
メッセージブローカ、メッセージキュー
商用
•TIBCO, IBM WebSphere, and webMethods
オープンソース
•RabbitMQ, ActiveMQ, HornetQ, NATS,
and Apache Kafka
興味ある人は、ぐぐってね。
Distributed actor frameworks
って、なんだね。
•Akka
•Orleans
•Erlang OTP
私は興味ないので、これで4章終わり。
paxos and raft
• については、別の資料を参照
Raft 論文抄訳
https://sites.google.com/site/kandamotohiro/nosql/raft
• 以下の Ousterhout 先生の Raft user study ビデオ、おす
すめです。一時間ほどで、英語もとても聞き取りやすいです。
• https://www.youtube.com/watch?v=JEpsBg0AO6o - paxos
• https://www.youtube.com/watch?v=YbZ3zDzDnrw - raft
終わり。

More Related Content

Similar to Designing data intensive applications-ch4

Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache maruyama097
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編) daiki hojo
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門Daiyu Hatakeyama
 
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだScalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだyoshiaki iwanaga
 
Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4Sho Shimauchi
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen直久 住川
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムオープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムShinya Takamaeda-Y
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy systemTakamchiTanaka
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門Daiyu Hatakeyama
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜griddb
 
Klab expert camp 成果発表
Klab expert camp 成果発表Klab expert camp 成果発表
Klab expert camp 成果発表teruyaono1
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方Sho Shimauchi
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解するNorimasa FUJITA
 
プログラマ人生論
プログラマ人生論プログラマ人生論
プログラマ人生論ymmt
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code readingHiro Yoshioka
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworkstripodworks
 
PGXのレスポンスとリソース消費
PGXのレスポンスとリソース消費PGXのレスポンスとリソース消費
PGXのレスポンスとリソース消費Tatsumi Akinori
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 

Similar to Designing data intensive applications-ch4 (20)

Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache 
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
 
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだScalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
 
MongoDB3.2の紹介
MongoDB3.2の紹介MongoDB3.2の紹介
MongoDB3.2の紹介
 
Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムオープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy system
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
 
Klab expert camp 成果発表
Klab expert camp 成果発表Klab expert camp 成果発表
Klab expert camp 成果発表
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解する
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 
プログラマ人生論
プログラマ人生論プログラマ人生論
プログラマ人生論
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 
PGXのレスポンスとリソース消費
PGXのレスポンスとリソース消費PGXのレスポンスとリソース消費
PGXのレスポンスとリソース消費
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 

Designing data intensive applications-ch4

Editor's Notes

  1. 2019年2月 kanda.motohiro@gmail.com 作成。 CC BY-SA 4.0 のもとで公開します