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

サービスを長期的にGoで開発・運用していくためにやっていること

yoske
December 13, 2022

 サービスを長期的にGoで開発・運用していくためにやっていること

長期的にGoで開発・運用していくために考える必要のあることは
・アーキテクチャ設計
・コード設計
・実装方法検討
・技術・ライブラリ選定
・運用体制
・監視
・DevSecOps
・コスト最適化
その他、など多数ありますが、技術・ライブラリ選定の部分にフォーカスを当てて、3rd Party 技術の評価について考えていることを共有します。

yoske

December 13, 2022
Tweet

Other Decks in Programming

Transcript

  1. • Engineer@Money Forward, Inc. • MFBC API推進部 • 京都拠点所属 •

    最近よく書く言語 ◦ JavaScript/Go/YAML/HCL 我が家のGopherくんたち
  2. • インフラ運用は社内のインフラ専任チームにある程度お任せしている
 ◦ 各サービスごとのAWS/k8sをプロビジョニングしてくれる社内基盤サービスがある 
 ◦ どんなリソースが必要かは開発チームが設計する必要がある 
 ◦ アプリケーションの運用責任は開発チームにある

    (AWSのように責任共有モデル )
 ◦ 社内インフラ基盤を紹介している blog記事
 ▪ https://moneyforward.com/engineers_blog/2021/12/28/next-service-platform/
 ▪ https://aws.amazon.com/jp/solutions/case-studies/moneyforward/
 • アプリケーションの利用技術はチームの裁量で決まる
 • デプロイワークフローはGitHub -> CircleCI -> k8s(EKS) が基本の流れ
 社内の開発基盤
  3. • アーキテクチャ設計
 • コード設計
 • 実装方法検討
 • 技術・ライブラリ選定
 • 運用体制


    • 監視
 • DevSecOps
 • コスト最適化
 • その他、多数・・・
 長期的に開発・運用するために必要な要素 今回話すこと
  4. ありふれたアルゴリズム・技術要素なら標準も含め、ライブラリも複数あ る、でもどうやって選ぶ?
 • GitHub stars ⭐ が多いもの?
 • awesome-go に載っているもの?


    • 技術記事(medium, dev.to, Qiita, Zenn, etc..)に載っている?
 • Stack Overflow で教えてもらう?
 3rd Party 技術の評価
  5. リストアップはしたとして、どのように比較する?
 Webサーバーのライブラリを例にしても大量にある。
 • net/http (Go standard library)
 • Gin (https://github.com/gin-gonic/gin)


    • Echo (https://github.com/labstack/echo)
 • Beego (https://github.com/beego/beego)
 • Revel (https://github.com/revel/revel)
 • その他多数・・・ 
 (2022/12月時点だと awesome-go の Web Frameworks には52個載ってる)
 
 3rd Party 技術の評価
  6. 自分たちに合う技術・ライブラリかどうかは外野の評判ではなく、自分たちにとって のメリット・デメリットを比較する。
 • 必須機能を満たしているか
 ◦ 単体・または組み合わせで技術的課題を解決できるのか 
 • 便利機能や拡張性が、運用していくと役立ちそうか
 •

    ドキュメントの量やコミュニティによる技術記事は適量か
 ◦ コードベースが大きく難解なものであればあるほど、これらが充実していないと扱っていくの が難しい
 ◦ 逆に、コードベースが小さく、シンプルであればコードを読めば済む 
 ◦ チームの技術力によって相対的に変わる 
 3rd Party 技術の評価
  7. 比較要素
 • メンテナンスの実態は?
 ◦ issueやPull Requestは対応されているか 
 ▪ バグ報告や機能提案の Feedbackを行ったときに対応されそうか

    
 ▪ issueが立っていないなら、いずれ自分が作成する側になるが、選定段階で確 認するのは難しい・・・ 
 ◦ 必要に応じたリリースはされているか 
 ▪ 機能追加とかは無くていいので、セキュリティ Fixが迅速におこなわれるか 
 ▪ 毎年2回のGoの新バージョンリリースがあるので、互換性確認はされているか 
 • メンテされているなら CIのtarget version等に追加が発生する 
 3rd Party 技術の評価
  8. 比較要素
 • コードは読みやすいか?
 ◦ Goはソースコードへのアクセスしやすい言語なのでドキュメントにない挙動の理解は ソースコードが頼りになる 
 ◦ 奇抜なことをせずに、素直に実装してあるコードが読みやすい 


    ◦ テストコードやExampleが充実していると読み解きやすい 
 • 自分たちの環境と共通点を持つところでの利用実績があるか
 ◦ システムの規模感など 
 ◦ ちょっと試してみた系のブログ記事は沢山あるかもしれないが、多大なワークロード に耐えられるかのベンチマークが必要 
 3rd Party 技術の評価
  9. 比較要素
 • ライセンス
 ◦ Copyleft系ではないか? 
 ▪ 商用コードとしては意図しないライセンス汚染をされないようにしたい 
 ◦

    商用の場合のライセンスは?商用は別のデュアルライセンスではないか? 
 ▪ その場合のコストは適正か 
 ◦ No Licenseではないか?
 ▪ ライセンス無しであれば、使ってはいけない 
 ▪ ソース公開されていても利用許諾してないことになる 
 ▪ どうしてもの場合は、メンテナにライセンス明記してくれと頼む 
 3rd Party 技術の評価
  10. 比較要素
 • まずは小さく試してみる
 ◦ サンプルがあれば動かしてみる 
 ◦ プロトタイプとして使ってみたい箇所に組み込んでみる 
 


    評価の観点は色々あるけれど、カテゴリ毎に何十個と候補のあるGoのライブ ラリそれぞれについて丁寧に評価なんてしていられない!
 3rd Party 技術の評価
  11. Webライブラリの例だと
 • net/http: メンテ◎
 • Gin: メンテ△ (issues/PR が溜まりすぎて処理できていない)
 •

    Echo: メンテ◎
 • Beego: メンテ◎
 • Revel: メンテ× (2019に入った頃からほとんど開発動いていない)
 ※個人の主観による判断です (2022/12時点)
 • Gorilla Toolkit (gorilla/mux等) メンテ終了しました😢
 ◦ https://github.com/gorilla/mux/issues/659
 ◦ 2022/12/10にメンテしないことが決定し、アーカイブされた 
 終わりは身近なところに
  12. • 必要な箇所で必要なデータを渡せば、求める結果をくれる
 ◦ こちらのコードにそれ以上の干渉をしてこない 
 • フレームワークと呼ばれるものはその逆で、こちらのコードの書き方、設 計を変更することを求めてくる
 
 自分たちの失敗例:


    • wireがDI Frameworkだということを認識せずに導入し、コードの書き方が wireありきのも のになってしまった
 • wireの不満があっても、からみつく鉄線のごとく抜けるのにはひと苦労しそう 
 1. 解決したい課題を最小で解決してくれる
  13. • 標準ライブラリで再実装することが容易になる
 ◦ Goがv1.0リリースから10年間、互換性を最大限保ってきたので、 Goの標準ライブラ リには安心して依存できる 
 • GoのGin, Echoといった軽量Webフレームワークはほとんどnet/httpと

    1:1での書き換えが可能なため、メンテナンスされなくなったとしてもダ メージは少ない
 ◦ 逆にnet/httpでいいじゃないという Gopherが多い理由でもある 
 
 
 
 3. 標準ライブラリとの互換性や親和性が高い
  14. APIはこれだけやって初めて価値提供できたと言える
 • 0. APIの基盤を用意する
 • 1. APIの開発と公開 (社内の他サービスがそれぞれ提供する)
 • 2.

    APIを利用するアプリ開発または連携機能実装 (社内または社外)
 • 3. 連携機能を利用するユーザーが使う
 大元となる「0. APIの基盤」を早くリリースしないと、
 その後の価値提供に続かない󰝊💨
 API基盤を最速で提供する必要性