Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ネットワークコントローラ実装で学ぶ、Goクライアントサーバシステムの作り方(Go Conference 2023)

ネットワークコントローラ実装で学ぶ、Goクライアントサーバシステムの作り方(Go Conference 2023)

Go Conference 2023(https://gocon.jp/2023/sessions/
ネットワークコントローラ実装で学ぶ、Goクライアントサーバシステムの作り方
Room B: B14-S 17:10~

Motoki Takenaka

June 07, 2023
Tweet

More Decks by Motoki Takenaka

Other Decks in Technology

Transcript

  1. © NTT Communications Corporation All Rights Reserved. 2 名前: ⽵中

    幹 (たけなか もとき) 所属: NTT コミュニケーションズ イノベーションセンター テクノロジー部⾨ Go 歴: 1.5 年 業務: Multi-AS Segment Routing (SR-MPLS, SRv6) に関する技術検証 SR網運⽤効率化のためのコントローラ (PCE) 開発 =>本セッションの関連内容 検証⽤ NW の運⽤・更改 ⾃⼰紹介
  2. © NTT Communications Corporation All Rights Reserved. 8 今⽇話すこと •

    アプリケーション層のプロトコルライブラリが存在しない クライアントサーバシステムの作り⽅ • Go 初学者が OSS を実装してみた感想
  3. © NTT Communications Corporation All Rights Reserved. 9 ⽬次 •

    ネットワークコントローラ実装について • Go の選定理由 • PCE とは • クライアントサーバシステムの作り⽅ • 複数のクライアント処理 • プロトコルセッションの維持 • API の提供 • Go 初学者が OSS を実装してみた感想 • 学習・開発過程 • interface の話
  4. © NTT Communications Corporation All Rights Reserved. 11 Go の選定理由

    • 標準機能 goroutine・channel とコントローラ実装との相性 • 可読性の⾼いマルチスレッド処理の実装が可能 • マルチスレッド関連ライブラリの習熟が低コスト • ネットワーク系の有名ツール GoBGP の存在 • コードリーディングによるサーバ実装の学習コスト低減 • デザイン踏襲による NW 系開発者からのコントリビュート期待 GoBGP … ルータ間で経路情報を動的に交換するための ルーティングプロトコルを扱う OSS GoBGP https://osrg.github.io/gobgp/
  5. © NTT Communications Corporation All Rights Reserved. 12 PCE とは

    • 複数のルータと • TCP 上で動作する専⽤プロトコル(PCEP) で • プロトコルセッションを維持しながら 経路制御情報を取得・適⽤するコントローラ また、PCE 利⽤者に対して • セッション情報・経路制御情報を取得・更新するための API を提供する 実装した PCE https://github.com/nttcom/pola ↑実際のコードはこちらで読めます︕↑ PCE 利⽤者 ルータ ルータ ルータ PCEP PCEP PCEP API
  6. © NTT Communications Corporation All Rights Reserved. 14 実装の要件 •

    複数クライアントの処理 (クライアント待機スレッド) • クライアント数のスケーラビリティのための並⾏処理 • 各セッションは完全に独⽴処理 • 専⽤プロトコルセッションの維持 (セッション処理スレッド) • セッション維持とパケット処理の並⾏処理 • パケット処理で close 指⽰があればセッションごと終了 • API の提供 (API 提供スレッド) • 専⽤プロトコル⽤サーバ実装と API サーバ実装の並⾏処理 • 各サーバでエラーが出た際にはメインスレッドから終了 goroutine と channel を⽤いて要件を満たす実装をしていく ※ パケットの送受信・解析処理はプロトコル依存のため本発表のスコープ外とする API 提供 クライアント待機 セッション処理 パケット 処理 セッション処理 パケット 処理 サーバ利⽤者 クライアント クライアント API 通信 セッション 維持 データの 送受信
  7. © NTT Communications Corporation All Rights Reserved. 15 サーバ クライアント

    サーバ利⽤者 API 提供 クライアント クライアント クライアント待機 セッション処理 パケット 処理 セッション処理 パケット 処理 セッション処理 パケット 処理 複数クライアントの処理 処理スレッド
  8. © NTT Communications Corporation All Rights Reserved. 16 複数クライアントの処理(実装) クライアント待機処理:

    クライアント待機 スレッド セッション処理 スレッド1 goroutine セッション処理 スレッド2 goroutine セッション処理 スレッド3 goroutine クライアントからのTCP コネクション -> サブスレッド作成 スレッド内で処理が完結するため channel は不要 参考: https://github.com/nttcom/pola/blob/9755e799665df8162957e0cdfdfab1c38bf5b3f3/pkg/server/serv er.go#L79-L111
  9. © NTT Communications Corporation All Rights Reserved. 17 サーバ クライアント

    サーバ利⽤者 API 提供 クライアント クライアント クライアント待機 セッション処理 パケット 処理 セッション処理 パケット 処理 セッション処理 パケット 処理 プロトコルセッションの維持 処理スレッド セッション 維持 データの 送受信
  10. © NTT Communications Corporation All Rights Reserved. 18 プロトコルセッションの維持(実装) セッション処理:

    セッション処理 スレッド パケット処理 スレッド goroutine channel 終了受信待ち & Keepalive パケット処理スレッド作成 パケット処理スレッドからの done シグナルと ⼀定間隔の ticker シグナルの双⽅を待機 参考: https://github.com/nttcom/pola/blob/9755e799665df8162957e0cdfdfab1c38bf 5b3f3/pkg/server/session.go#L43-L81
  11. © NTT Communications Corporation All Rights Reserved. 19 サーバ クライアント

    サーバ利⽤者 API 提供 クライアント クライアント クライアント待機 セッション処理 パケット 処理 セッション処理 パケット 処理 セッション処理 パケット 処理 API の提供 処理スレッド
  12. © NTT Communications Corporation All Rights Reserved. 20 API の提供

    どのように提供する︖ • REST API • RPC など... マイクロサービスな⾃作コントローラの⼀部として⽤いる上で、 関連ツールでも利⽤されている gRPC を採⽤ 画像: https://speakerdeck.com/watal/da-gui-mo-srwang-falseyun-yong- woxiao-lu-hua-surunetutowakukontororafalsekai-fa-ntt-tech-conference-2022
  13. © NTT Communications Corporation All Rights Reserved. 21 API の提供(実装)

    操作者・操作ツールとのやり取りで利⽤するデータの構造体やデータ型の決定 gRPC プロトコル定義ファイル • プロトコル定義ファイルによって API となる関数名や 送受信データ型を決定 • ⼊出⼒に必要なデータの構造体や API 実⾏⽤関数を ライブラリとして取得可能 • 多様な⾔語のコードへコンパイル可能 関数名 送受信データ型
  14. © NTT Communications Corporation All Rights Reserved. 22 API の提供(実装)

    gRPC サーバにおける API 実⾏時の処理を実装 • Serve 実⾏により API の提供を開始 • 各 API 実⾏時の処理をメソッドとして実装可能 • API Server 構造体の要素としてサーバ全体の 情報を保持することで API 実⾏時にサーバの更新・情報取得が可能
  15. © NTT Communications Corporation All Rights Reserved. 23 API の提供(実装)

    サーバメインスレッド: サーバメインスレッド API 提供⽤ スレッド クライアント 待機スレッド goroutine goroutine channel channel error 受信待ち メインスレッドから 2 スレッド作成 • API 提供 • クライアント待機 channel は各スレッドのエラー通知 兼 close シグナル 参考: https://github.com/nttcom/pola/blob/9755e799665df8162957e0cdfdfab1c38bf 5b3f3/pkg/server/server.go#L32-L77
  16. © NTT Communications Corporation All Rights Reserved. 25 Go の学習・開発過程

    やったこと: • GoBGP コードリーディング • ディレクトリ構成や⽤途・命名規則・プログラム構成・コード配置 など • 簡易的なコントローラ実装 • チームミッションである “新技術やアイデアを迅速に実践” に沿った実装⽅針 • GoBGP をサンプルとしてプロトタイプコントローラを実装 • リファクタリング • OSS に向けた コードの記法統⼀や整理など 各スレッド構成を練り goroutine でマルチスレッド処理すればコントローラ実装は⽐較的容易 interface は理解するのが少し難しいイメージ -> 次ページから (再掲) 実装した PCE https://github.com/nttcom/pola
  17. © NTT Communications Corporation All Rights Reserved. 26 既存の interface

    実装を理解して使いこなす メタ情報を含む netip.Addr 構造体 (https://pkg.go.dev/net/netip#Addr) にて String() メソッド • fmt.Stringer interface の実装 • print 系関数 x fmt.Stringer で String() が暗黙に実⾏ MashalText() メソッド • encoding.TextMarshaler interface の実装 • json.Marshal x encoding.TextMarshaler で MashalText() が暗黙に実⾏ ... interface の実装作法を理解し、利⽤時に統⼀感ある実装に
  18. © NTT Communications Corporation All Rights Reserved. 27 任意の Type

    に interface を実装する map を json 出⼒する際に、要素である enum の値を⽂字列にしたい • encoding.TextMarshaler interface 未実装 • encoding.TextMarshaler interface 実装 任意の type 実装部分のコードの可読性向上 type 利⽤時に実装の理解が容易に
  19. © NTT Communications Corporation All Rights Reserved. 28 独⾃ interface

    を定義する とある構造体 Message A に多様(可変⻑・optional)な Object が内包されるような状況にて (例) Message A (Object 構造体を利⽤する側) の Object への要求 • 各 Object のデータ操作は⾏わない • Message A 内において Slice で⼀括管理したい • Decode と Serialize ができてほしい • バイト⻑を出⼒できてほしい • Message A を JSON 形式にするときに Object も 適切に出⼒してほしい 新規 Object の実装や interface 利⽤側の実装を相互に隠蔽して実装が可能
  20. © NTT Communications Corporation All Rights Reserved. 29 まとめ •

    アプリケーション層のプロトコルライブラリが存在しない クライアントサーバシステムの作り⽅ • 複数クライアントの処理 • プロトコルセッションの維持 • API の提供 • Go 初学者が OSS を実装してみた感想 • Go の学習・開発過程 • interface の学び⽅
  21. © NTT Communications Corporation All Rights Reserved. 31 © NTT

    Communications Corporation All Rights Reserved. 31 © NTT Communications Corporation All Rights Reserved. ※画像背景⽤(淡⾊) スライドマスターよりコピー&ペーストにて使⽤ください。
  22. © NTT Communications Corporation All Rights Reserved. 32 © NTT

    Communications Corporation All Rights Reserved. 32 © NTT Communications Corporation All Rights Reserved. ※背景画像使⽤イメージ 32 © NTT Communications Corporation All Rights Reserved.