Go言語による分散サービスのメモ
まず、筆者の謝辞を読んで、RaftとSerfは良いパッケージだし、hashicorpのConsulから多くを学んだ的なことを書いている。
となると、Dkronでserfとraftが使われてて、hashicorp製のパッケージが多く使われているDkronを読み始めたのは完全に正解だった可能性がある。良かった。
gRPCは通信規格であり、protobufはシリアライズ/デシリアライズの規格である。
これごっちゃになりがちだけど別なものなんだよね、たぶん。
コンパイラは構造体に対してさまざまなメソッドを生成しますが、直接使うメソッドはゲッターだけです。構造体のフィールドを使うこともできますが、同じゲッターを持つ複数のメッセージがあり、それらのメソッドをインタフェースとして抽象化したい場合、ゲッターのほうが便利です。たとえば、Amazonのような小売サイトを作っていて、本やゲームなどさまざまな種類の商品を販売しているとします。それぞれの商品には価格を表すフィールドがあり†15、ユーザのカートに入っている商品の合計額を求めたいとします。Pricerインタフェースを定義し、Pricerインタフェースのスライスを受け取り、その合計額を返すTotal関数を作るとします。コードは次のようになります。
これ確かにーってなった。
サービスディスカバリとして
- サービスを使う
- 組み込む
の選択肢があるが、今まで後者の選択肢はなく、前者の選択肢としてconsulやzookeeperなどがあった。
だが、今はSerfがあって、これを使えば後者の選択肢を取れる。
後者であれば、サービスの利用者はconsulやzookeeperの利用方法を知る必要がなく、サービスをout of boxで使える。
CockroachDBはRaftを応用したMultiRaftというレイヤーを作ったらしい。
サーバプロキシ(server proxying):クライアントは、(サービスレジストリに問い合わせるか、サービスレジストリとなって)サーバを把握しているロードバランサ(load balancer)にリクエストを送り、ロードバランサがリクエストをバックエンドに中継します。
外部ロードバランス(external load balancing):クライアントは、サーバを把握している外部ロードバランスのサービスへ問い合わせて、どのサーバにRPCを送信すればよいかを知ります。
クライアント側ロードバランス(client-side load balancing):クライアントはサービスレジストリに照会してサーバを知り、RPCを送信するサーバを選び、RPCを直接サーバへ送信します。
ロードバランシング戦略。
今思うとnsq https://github.com/nsqio/nsq は外部ロードバランシング戦略 or クライアント側ロードバランスに近そう。
これ、何がどう違うんだ?