「プロダクションレディマイクロサービス」を読んだ

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

最近、分散トレーシングの導入を目論んでUberのJaegerを触っていて、分散トレーシングはマイクロサービスの文脈で語られることも多いので無関係ではないということで読んだ。著者がUberのSREということもある。この本はマイクロサービスアーキテクチャを採用する際 / した後に、それを「プロダクションレディ = 本番対応」なサービス水準に押し上げて維持していくためのエッセンス集のようなもの。マイクロサービス自体の解説は殆ど無いので、Sam Newmanの「マイクロサービスアーキテクチャ」とかMartin Fowlerのブログを読んでおいた方が良い。

マイクロサービスアーキテクチャの適否については散々語り尽くされてきて通念化してるものがあって、プロダクトのライフサイクルとか組織が受ける制約とか種々の要因で適するものは限られるけど、この本に書かれている殆どのことはアーキテクチャに依らず有益だと思う。マイクロサービスアーキテクチャを採るとより一層必要性が高まるというだけ。 ろくに考えずに部分的に取り入れると崩壊しそうなものもあるので注意が必要だけど、可能な限り実践していきたい。

達成度を測定するチェックリストが各章末に付いていて、それが良く纏まっているので使えそう。


メモ

  • 1章 マイクロサービス
    • 4層モデル
      • マイクロサービス, アプリケーションプラットフォーム, 通信, ハードウェア
      • 下位3層インフラストラクチャレイヤの抽象化
    • エコシステム
      • 複数のマイクロサービスと抽象化されたインフラストラクチャレイヤ
  • 2章 本番対応
    • エコシステム全体で高い品質を維持
      • 可用性確保 / 高いSLAの実現
      • エコシステム全体の標準化
        • 共通的に現実に適用でき測定可能な標準と要件
        • 8つの原則
          • 安定性, 信頼性, スケーラビリティ, 耐障害性, 大惨事対応, パフォーマンス, 監視, ドキュメント
  • 3章 安定性と信頼性
    • カナリア
    • 依存関係の障害に対する防御策
      • バックアップ / 代替サービス / フォールバック / キャッシュ
  • 4章 スケーラビリティとパフォーマンス
    • 並行性とパーティション分割
    • 成長の判断基準
      • ビジネスメトリックに基づく質的基準
      • 質的基準を定量化した量的基準
  • 5章 耐障害性と大惨事対応
    • 障害シナリオ
      • 内部障害 (マイクロサービス自身) と外部障害 (依存関係, 下位レイヤ)
    • 回復性テスト
      • コードテスト (lint, UT, IT, E2E) , ロードテスト, カオステスト
    • インシデント対応の5ステップ
      • 評価, 調整, 緩和, 解決, フォローアップ
  • 6章 監視
    • 主要メトリック
      • マイクロサービスメトリックとインフラストラクチャメトリックへの分類
  • 7章 ドキュメントと組織的な理解

「Real World HTTP」を読んだ

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

良著だった。 ここ一ヶ月くらいがっつり手を動かす時間が取れなかったので、隙間時間で読める本として選んで通勤時間とか使って読んだ。

この本はプロトコルの解説書ではないし、ITエンジニア向けのHowTo本でもなく、HTTPの変遷を軸とする歴史書、というのがしっくりくる。 HTTP/0.9からHTTP/2.0に至るまでを、クライアントの多様化やアプリケーションのリッチ化といった環境変化に対して、障壁を乗り越えながらそれを実現してきたWeb技術、そしてそれを支えるように進化してきたHTTPという形で構成されている。 そして、それぞれのトピックが著者の実地での知見で肉付けされていて、"Real World"感がある。

個々の技術については、その詳細は他に譲っていて、Webの発展の過程を伝えるのに必要十分な解説がなされていると思う。 それによって、自分の中の知識を体系立てて整理できる。 こういう位置付けの書籍は他にないか、アップデートされていないので、今後も加筆を続けてほしい。

「HTTPはインフラ」という表現が途中で何度か出てきて、最初は腑に落ちないが読み終えると意図することが伝わってくる。 おすすめ。

Last.fm APIのgolangラッパーを作った

修論の合間に書きはじめて放置していたので一通り書き上げた。
https://github.com/shkh/lastfm-go

一昔前のLast.fmには邦楽アーティストの情報があまりなくて使えない感じだったけど、最近はかなり充実してきていて、アーティストの情報やアルバムの楽曲リストを取ってくるにはかなり良い選択肢だと思う。提供されてるAPIが幅広くて、いろんな統計情報も取ってこれる。

たとえば最近気合入ってるアーティストの一覧とか。

api := lastfm.New(APIKEY, SECRET)
result, _ := api.Chart.GetHypedArtists(nil)
for _, artist := range result.Artists {
    fmt.Println(artist.Name)
}
East India Youth
Blood Cultures
Jennifer Nettles
Painted Palms
7Horse
Luke Bond
Syn Cole
Kwabs
Kevin Drew
Raleigh Ritchie
・
・
・

全部知らん。

認証はモバイルアプリ向けとデスクトップアプリ向け、ウェブアプリ向けの3通りがあって、適当に選んで認証する。たとえばモバイルアプリ向けは

err = api.Login(username, password)

という感じ。

認証したら禊は完了、ShoutしたりScrobbleしたり色々遊べる。

err = api.User.Shout(lastfm.P{"user": "shkh_", "message": "ʕ ◔ϖ◔ʔ"})

Scrobbleするには、Track.UpdateNowPlayingとTrack.Scrobbleを使う。

start := time.Now().Unix()
p := lastfm.P{"artist": artist, "track": track}
_, err = api.Track.UpdateNowPlaying(p) //プロフィールに再生中のアイコンが表示される
if err != nil {
    return
}
time.Sleep(35 * time.Second) //ちょっと待たないといけない
p["timestamp"] = start
_, err = api.Track.Scrobble(p)
if err != nil {
    return
}