Skip to content

freee Tech Night 「freeeにおけるモノリシック」

   

https://freee-tech-night.connpass.com/event/157012/

会計freeeのデプロイを10倍早くした話

北川修平 (shuheiktgw)

  • 会計freee

  • Phusion Passenger
  • Capistrano を使ったデプロイ
    • 問題点
      • 直列デプロイ
        • LBから1つづつ外してデプロイしている
      • 50分ちかくかかっている
    • 解決案
      • EKSへの移行
      • AutoScalingGroupを使ったBlue/Greenデプロイ
        • サーバー自体のプロビジョニングに4分ぐらいかかる
      • アプリケーションサーバー(unicorn)によるホットデプロイ
        • これを選択
        • デプロイ・ロールバックの時間が短くて済む
  • アプリケーションサーバーの入れ替え
    • Phusion PassengerをUnicornにした
    • 安全に入れ替えるには
      • 影響範囲が大きい
      • プランBの確保
        • Blue/Greenを用意
      • 変更対象を深く理解する
        • ソースコードリーディング
        • 起動から陸セストをさばき始めるまでの流れ
        • USR2シグナルを受け取ったときの処理
        • 各パラメータの使われ方と影響範囲
  • PreloadによるFileDDescriptorの共有
    • Linuxのfork処理の理解が必要
  • 段階的リリース
    • テスト環境での負荷試験
      • 「負荷試験コトハジメ」
    • 他サービスでの先行リリース
    • 本番環境でのカナリアリリース
      • 2%程度
  • Unicornへ移行した結果
    • 25〜30分かかっていたのが2〜3分に短縮
      • デプロイ数の増加
    • Redisまわりで一部問題があった
  • FusionPassengerの有料版なら同じことできるが、サービス規模で試算したら高額だった

データの構造から再検討するパフォーマンスチューニング

久保卓也 (tkuboma)

  • 会計freeeの中の話
  • 監視
    • Mackrel
    • NewRelic
    • Monyog
      • DBリアルタイム監視に利用
    • Datadog
  • Redashで見えるか
    • index効率、フルスキャンなど
  • DBパフォーマンス改善
    • indexでチューニング
      • explainで地道に
      • インデックス追加したり、使うようにしたり
      • ActiveRecordのscopeに注意
      • indexを無駄にはらない
      • 検証は本番相当のデータで
    • クエリの変更でチューニング
      • 対象データのrowが多すぎる
        • 抽出条件の追加
      • クエリの結果が変わらないように注意
        • アプリケーション側で頑張る
    • データの持ちかたの見直し
      • idでなくstringでjoinしているテーブル
      • マスターデータとunionしている
        • マスターデータをコピーしてしまう
      • 頻繁にマスターデータが更新されるテーブルだと使えない
        • 設計でカバー
    • テーブル構成の見直し
      • 大量データを都度集計している
        • 集計テーブルを作成する
          • 圧縮率=削減行数
      • ロック問題
        • 別トランザクションにして非同期実行する
          • Kinesis streamを利用
      • 集計テーブルのデータの切り方の設計重要
      • リアルタイム性の低下
      • 導入までのリードタイムが結構かかる
    • 機能の見直し
      • 必要以上に実行されていないか
        • Home画面とか
      • ビジネスサイドとのコミュニケーション必要
    • slaveへ逃がす
      • レプリケーションのラグに注意
      • 社内ライブラリを使用(OSSではない)
    • N+1の解消
      • bullet
    • Elasticsearch化

エンジニアがドメインロジックに集中するためのコアパッケージ整備

志賀誠 (@Maco_Tasu)

  • コアパッケージ:各サービスで共通して使われるもの
    • ロガーやエラーとか
  • マイクロサービス化でgoを使うことが多い
  • マイクロサービス基盤にK8sを採用
  • マイクロサービス化で各チームでそれぞれ作り込んでいて横連携ができていなかった
    • サービス基盤
  • 全マイクロサービスのコードを読んで機能を洗い出す
    • goらしい作りになっているか
  • デファクトとしてのパッケージ
    • 強制するものではない
  • 拡張性
    • ダッグタイピング
    • go-cloud(CDK)を参考にした
  • かんたんに組み込める
  • 改善点
    • 早めに提供して改善ループをまわす
    • 使うことによる利点を伝える
  • claat