はじめに
まつもとゆきひろの著書「コードの未来」を読んで
覚えておきたいことをまとめる。
4章~6章が「知らないけどどう勉強したらいいか分かりづらいこと」と思っていたことを
体系的に説明してくれていて勉強になった。
本書は以下のチャプターに分かれている。
日経Linux連載をまとめたもの故、各チャプターで微妙に内容の重複があるが
「大事なことを繰り返し言ってくれてる」ので、ありがたい。
- 1章 プログラミングの時空間
- 2章 言語の過去、現在、未来
- 3章 言語の新潮流
- 4章 クラウド時代のプログラミング
- スケーラビリティ
- C10K問題
- HashFold
- プロセス間通信
- RackとUnicorn
- 5章 ビッグデータを支えるデータストア技術
- key-valueストア
- NoSQL
- MongoDBをRubyから操作
- SQLデータベースの逆襲
- memcashedとその仲間たち
- 6章 マルチコア時代のプログラミング
- ムーアの法則
- UNIXパイプライン
- ノンブロッキングI/O
- node.js
- ZeroMQ
4章のメモ
データとハッシュ
まず、データの検索にかかる計算量の話から始まる。
最も単純な線形検索(O(n))、ソートされていて2分検索できるケース(O(log n))、
そしてハッシュを使ってデータ量によらず定数時間のケース(O(1))。
ハッシュを使ってデータの格納位置を決めることで検索時間がデータ量に依存しないというのは5章のNoSQLにつながる重要な導入。
Pythonで何気なく使っている辞書型も実はこれ。
ハッシュを使った例としてブルームフィルタが書かれていて(知らなかった)、これもなるほどと思った。
selectとepoll
C10K問題に際して、selectとepollの違いについて具体的なコードを用いた説明がある。
ここらへん分かりやすい説明が少ないので貴重。libevなるイベントループのライブラリも知らなかった。
RackとUnicorn
最近、PythonでのWebアプリ作成を勉強していて登場するフレームワークの多さに混乱していた
ので興味を持って読んだ。RubyにおけるRackとUnicornは、PythonにおけるWSGIとGunicornに対応する。
nginxをリバースプロキシとしてWebサーバへリクエストをpushする際、以下が問題になり得る。
- リバースプロキシはWebサーバの状態を基本的に知らない
- なので処理が停滞していたり不調に陥ってるWebサーバにリクエストが振られる可能性がある
UnicornはMaster-Slave構成で、かつpull型でリクエストをWebサーバに与えることで問題を解決している。
5章のメモ
RDBの問題
- ACID特性: Atomicity, Consistency, Isolation, Durability
- CAP定理: Consistency, Availability, Partition Tolerance(のうち1つは諦めるべし)
- BASE: Basically Available, Soft-state, Eventually consistent
NoSQL
従来のRDBではACIDを守るために頻繁にデータベースの排他制御が発生する、つまり待たされる。
水平分割(ユーザIDが奇数か偶数かでテーブルを分割)や垂直分割(カラムでテーブルを分割)などの工夫はある。
NoSQLは大きく分類すると以下になる。
- key-valueストア
- ドキュメント指向データベース(key-valueのvalueがXMLやJSON)
- オブジェクト指向データベース(まだよくわかってない)
ドキュメント指向は最近よく聞くMongo DBが一例。ドキュメントの中身も検索できたりする。
keyとドキュメントを紐付けるだけなので、途中から内容(RDBでいう列)が変わってもいい。
その他
- 高速性のためのオンメモリデータベース、VoltDBやmemocached
6章のメモ
ムーアの法則の源泉
LSIの微細化のメリット:寸法を1/2にすると
- 速度が2倍で
- 消費電力が1/4で
- 製造量が4倍になる
マルチコアの活用
make -j4
は知っていたが、xargs -P 4
は知らなかった(4は実行するプロセス数なので任意)。
また、シングルコアマルチタスクとマルチコアマルチタスクの図解も分かりやすかった。
マルチスレッドとマルチプロセス
マルチスレッドはメモリを共有できるが、それはそのままデメリットにもなる。タイミングバグなど再現困難な問題を起こす恐れがあり安全に使用しづらい。
また、1CPUでしか利用できないので苦労する割にスケーラビリティに欠ける。
マルチプロセスはメモリ共有しないため、明示的にプロセス間通信をする必要がある。
その方法選択は重要。
- パイプ
- SysV IPC
- ソケット
- TCPソケット
- UDPソケット
- UNIXソケット
ZeroMQ
クロスプラットフォーム、クロス言語なプロセス間通信ライブラリ。
便利そうであるが、GitHubを見るとちょっと開発滞っている?
総括
今まで断片的に得ていた知識を体系的に整理してくれる本で大変勉強になりました。
Matzに感謝。