Category
Rustで作るL4 TCPプロキシ
Cloudflare pingoraのようなゲートウェイミドルウェアを参考に、Rust+tokioでL4 TCPプロキシをゼロから実装します。ロードバランシングやヘルスチェックなど、L4の範囲に絞った設計・実装を扱います。
4件の記事
TCP接続によるアクティブヘルスチェックと、ロードバランサーからの動的除外
バックエンドの生死を定期的なTCP接続で確認し、死んでいるバックエンドをロードバランサーの選択候補から動的に除外する仕組みをRust+tokioで実装します。生死フラグの共有方法、並行したタイムアウト付き接続確認、「選べないかもしれない」という変化をtraitシグネチャとlet-else構文でどう表現するかを扱います。
続きを読むtrait経由で切り替え可能なロードバランサー設計と、4種のアルゴリズム比較
TCPコネクションを複数のバックエンドへ振り分けるロードバランサーをRustで実装します。アルゴリズムを実行時に差し替えられるようトレイトオブジェクトで抽象化したうえで、Round Robin・Random・Least Connections・Weightedの4種類を実装し、それぞれのアルゴリズム特有の設計判断(同着時の挙動やMutexが必要になる条件など)を扱います。あわせてモジュール分割とインラインユニットテストの設計にも触れます。
続きを読むRustの所有権を緩める道具 Rc/Arc/RefCell/Mutexと、Send/Syncが表すもの
Rustの「値の持ち主は1人まで」という所有権ルールは、複数の場所から同じ値を参照・共有したい場面ではそのままでは足りません。この制約を緩めるRc/Arc(複数の持ち主)とRefCell/Mutex(内部可変性)、その安全性を支えるアトミック命令とSend/Sync、実行時に型を確定させるdynについて、それぞれが解決する問題を切り分けて整理します。
続きを読むtokioの`copy_bidirectional`による非同期TCPバイト列転送とhalf-closeの伝播
TCPコネクションを別のTCPコネクションへ中継する処理をRust+tokioで実装します。tokioのfeatureを用途別に絞って導入する方針や、`tokio::io::copy_bidirectional`が単純な双方向コピーではなく、TCPの片方向クローズ(half-close)を個別に伝播する設計になっている点を扱います。
続きを読む