Carpe Diem

備忘録

ip netnsコマンドで学ぶNetwork Namespace

概要

Linuxには名前空間(Namespace)というカーネルの機能が提供されています。
これは1つのプロセスが1つのリソースセットを参照し、別のプロセスが異なるリソースセットを参照するようにカーネルリソースを分割する機能です。

その中の1つであるネットワーク名前空間(Network Namespace)の機能を学んでみます。

環境

ip netnsを使ってみる

初期状態

デフォルトのUbuntuでは以下のように2つのNICが存在します。

  • lo
  • enp0s3

コマンドで確認します。

$ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 02:b7:1f:33:e9:24 brd ff:ff:ff:ff:ff:ff
続きを読む

gRPCでのLoad Balancing

背景

gRPCでは主に

  • Proxy Model
  • Balancing-aware Client
  • External Load Balancing Service

といったLBアプローチがあります。

それぞれの特徴や実装方法を調べてみました。

Load Balancingアプローチ

こちらで定義されてます。

grpc/load-balancing.md at master · grpc/grpc · GitHub

主な負荷分散のアプローチとしては以下です。

続きを読む

gRPCでのClient-Side LB実装の変遷

概要

gRPCでのバランシングをClient-Sideで直接実装する方法の紹介です。

gRPCはPolyglot(様々な言語で扱う)を意識しているので、gRPC自体の仕様が策定→各言語がそれに則って実装となります。
なので「元々はこういう実装だったけど、他の言語と統一してこう変更したよ」みたいなissueをちょこちょこ見ます。

結果これまでの書き方がいつのまにかdeprecatedになってたりするので、以前の書き方から遡って調べてみました。

環境

続きを読む

go modulesでコマンドラインツールのバージョン管理をする

概要

goはModulesリポジトリのライブラリのバージョン管理を行えます。
ただコマンドラインツールに関してはgo getしてgo.modに追加されても、goファイルで扱っているわけではないのでgo mod tidyすると消えてしまいます。

しかしながら「この機能は最新のmasterにしかない。かと言ってgo get -u@masterで常に最新にしてしまうと互換性が壊れるかもしれない。だからバージョン管理できないと困る」というシチュエーションはよくあります。

その対策としては現状tools.goにblank importするのがベストプラクティスとなっています。

環境

  • go 1.13.6
続きを読む

GoのDIツールwireで知っておくと良いこと

概要

christina04.hatenablog.com

こういった設計のようにレイヤ間の依存関係を抽象化していると、DIの初期化処理が段々冗長になっていきます。

google/wireはそういったDIの初期化を自動的にやってくれるコード生成ツールです。
今回はwireを使う上で知っていると便利なところをまとめます。

環境

wireの使い方知らない人

以下のチュートリアルが非常に分かりやすいので一度やってみてください。

github.com

続きを読む