Closed7

Go言語による分散サービスのメモ

koheiyamayamakoheiyamayama

https://learning.oreilly.com/library/view/goyan-yu-niyorufen-san-sabisu-xin-lai-xing-kuo-zhang-xing-bao-shou-xing-nogao-isisutemunogou-zhu/9784873119977

まず、筆者の謝辞を読んで、RaftとSerfは良いパッケージだし、hashicorpのConsulから多くを学んだ的なことを書いている。

となると、Dkronでserfとraftが使われてて、hashicorp製のパッケージが多く使われているDkronを読み始めたのは完全に正解だった可能性がある。良かった。

koheiyamayamakoheiyamayama

gRPCは通信規格であり、protobufはシリアライズ/デシリアライズの規格である。
これごっちゃになりがちだけど別なものなんだよね、たぶん。

koheiyamayamakoheiyamayama

コンパイラは構造体に対してさまざまなメソッドを生成しますが、直接使うメソッドはゲッターだけです。構造体のフィールドを使うこともできますが、同じゲッターを持つ複数のメッセージがあり、それらのメソッドをインタフェースとして抽象化したい場合、ゲッターのほうが便利です。たとえば、Amazonのような小売サイトを作っていて、本やゲームなどさまざまな種類の商品を販売しているとします。それぞれの商品には価格を表すフィールドがあり†15、ユーザのカートに入っている商品の合計額を求めたいとします。Pricerインタフェースを定義し、Pricerインタフェースのスライスを受け取り、その合計額を返すTotal関数を作るとします。コードは次のようになります。

これ確かにーってなった。

koheiyamayamakoheiyamayama

サービスディスカバリとして

  • サービスを使う
  • 組み込む

の選択肢があるが、今まで後者の選択肢はなく、前者の選択肢としてconsulやzookeeperなどがあった。
だが、今はSerfがあって、これを使えば後者の選択肢を取れる。
後者であれば、サービスの利用者はconsulやzookeeperの利用方法を知る必要がなく、サービスをout of boxで使える。

koheiyamayamakoheiyamayama

サーバプロキシ(server proxying):クライアントは、(サービスレジストリに問い合わせるか、サービスレジストリとなって)サーバを把握しているロードバランサ(load balancer)にリクエストを送り、ロードバランサがリクエストをバックエンドに中継します。
外部ロードバランス(external load balancing):クライアントは、サーバを把握している外部ロードバランスのサービスへ問い合わせて、どのサーバにRPCを送信すればよいかを知ります。
クライアント側ロードバランス(client-side load balancing):クライアントはサービスレジストリに照会してサーバを知り、RPCを送信するサーバを選び、RPCを直接サーバへ送信します。

ロードバランシング戦略。
今思うとnsq https://github.com/nsqio/nsq は外部ロードバランシング戦略 or クライアント側ロードバランスに近そう。
これ、何がどう違うんだ?

このスクラップは2023/10/20にクローズされました