Open8

Go言語による分散サービス - 信頼性、拡張性、保守性の高いシステムの構築 // 読書メモ

esakaesaka

1章

  • KafkaっぽいのをGoで作っていくのかな?
  • シンプルなProduce/Consumeを受けつけるWebServer + バックエンド関数をまず作った
esakaesaka

2章

protobufを入れていくよ

Protobufの利点

  • 既知
    • 多言語間で簡易やりとりできる + 型保証される
    • ハイパフォーマンス
  • 初めて知った
    • バージョンが後方互換性(フィールドの追加のみ)を保証している
      • 新しいバージョンで新しいフィールドが追加されても、後続処理の一部がそれを利用しない場合は無視できる(フィールド毎に番号が振られるため)

メモ

go用のprotogen使う場合は、プロジェクトでgetでなく、グローバルに入れてgoのbinにパス通す

下記はfishshellの場合

$ go install google.golang.org/protobuf/...@v1.28.0
$ fish_add_path ~/go/bin/
esakaesaka

3章

より本格的なコミットメント

  • record:ログに保存されるデータ
  • store:recordを保存するファイル
  • index:インデックスエントリを保存するファイル
  • segment:storeとindexをまとめているもの
  • log:storeをすべてまとめているもの

で分けて、管理する
コード長い

あとで説明読み返さないと理解できないかも

logがkafkaでいう、topicかな?多分

kafkaでいうpartitionがsegmentで, その中にファイルが複数 + それの順序管理?するindexって感じ?
recordが1データって感じ

esakaesaka

4章

gRPCを導入する、Produce/Consumeを単一、ストリームで実行するサービスをprotobufで定義して、Go側でもそれと合わせた実装をしていく感じ

service Log {
  rpc Produce(ProduceRequest) returns (ProduceResponse) {}
  rpc Consume(ConsumeRequest) returns (ConsumeResponse) {}
  rpc ConsumeStream(ConsumeRequest) returns (stream ConsumeResponse) {}
  rpc ProduceStream(stream ProduceRequest) returns (stream ProduceResponse) {}
}
esakaesaka

メモ忘れてた

5章

認証周りを入れていく、ユーザー名/パスワードって感じでなく、サーバ/クライアント証明書で認証やる感じ

認証だけでなく、認可もやる, ACLを実装して
認証したユーザーのうちrootユーザーは全許可、nobadyユーザーはproduce/cosume許可しないというのを確認する


ACLまで行くと、ミドルウェア使わないとできないもんだと思ってたけど、Goのライブラリでシンプルに実装できるんだなと...

といっても7章以降の分散化だったり、実運用考慮すると.
アプリ再起動なしでもACL更新できたり、一箇所でACLルール管理できるミドルウェア採用する方がいいんだろうなとは思う

ACLを車輪の再開発して理解するって意味であると思うので、良い内容だと思う

esakaesaka

6章

メトリクス、構造化ログ、トレースを導入するというやつ.
可視化まではやらないのでちょっと分かりづらいかも...

構造化ログは便利だよねってのはこれまでの経験的にもわかってるのではいって感じ

esakaesaka

Ⅲ 分散化

7章

サービスディスカバリを導入する.
アプリでserfというライブラリで各種プロセス/サーバをクラスタとして動かす感じなんだけど.
テストだと全部ローカルホストで動かすかつ、テストプロセスがコーディネーター的に動いてるから, 新しいサーバプロセス立ち上げる時に既存のクラスタ情報を渡せたと思うのだけど、
同時に立ち上げる場合、互いに通信させるにはやっぱ中央管理必要なのでは?と思うのだがどうなんだろ?(マルチキャストやってなくない?という疑問)

あとは最後に書いてるけど、これだけだと循環レプリケーションされるよねって