Slide 1

Slide 1 text

(C) Link and Motivation Group Railsのレールに乗ってたら鈍行だった話 ~ 大量データでもサクサク動くアプリケーションになるために ~ リンクアンドモチベーション 江上 真人

Slide 2

Slide 2 text

(C) Link and Motivation Group 2 リンクアンドモチベーション 江上 真人 役割: テックリード&EM 趣味:料理 twitter: @MasatoEgami やってること: - モチベーションクラウドシリーズの設計・ 開発 - 性能改善プロジェクトのPM (※) 当社調べ。2019年6月時点。 はじめに 自己紹介

Slide 3

Slide 3 text

(C) Link and Motivation Group 目次 1. モチベーションクラウドシリーズのご紹介 2. 今日のテーマ 3. 最後に 3

Slide 4

Slide 4 text

1. モチベーションクラウドシリーズのご紹介

Slide 5

Slide 5 text

(C) Link and Motivation Group 5 すべての組織が、これで変わる - モチベーションクラウドシリーズ - 2016年リリース モチベーションクラウドは、組 織 状 態を診 断 ・ 改 善 することができる、 国 内 シェア No.1 (※)の組織改善クラウドサービスで す。 2019年リリース コミュニケーションクラウドは紙の社 内 報 やイントラネットに 代 わる、 社 内 コミュニ ケーションプラットフォームです。 2019年リリース チームワーククラウドはミドルマネジメント・ チームマネジメント強 化を実 現する、オー ルインワンコラボレーションツールです。 (※) 当社調べ。2019年6月時点。 モチベーションクラウドシリーズのご紹介 あらゆる組織の エンゲージメント向上をめざすクラウドSaaSです

Slide 6

Slide 6 text

(C) Link and Motivation Group モチベーションクラウドシリーズのミッション /ビジョン Mission すべての組織をこれで変える Vision 世界の経営指標を変える 6

Slide 7

Slide 7 text

(C) Link and Motivation Group モチベーションクラウドシリーズの価値 モチベーションクラウドシリーズには 二つの価値があります 7 お客様にとっての モチベーションクラウドシリーズ 社会にとっての モチベーションクラウドシリーズ 組織状態を可視化し 離退職を防ぐ等、経営改善をする 楽しく働く人を増やし 世の中からブラック企業なくす

Slide 8

Slide 8 text

(C) Link and Motivation Group 月会費売上推移 モチベーションクラウドの 売り上げ(月額費)は右肩上がり 8 1万人以上規模の企業(いわゆるエンタープライズ企業)にも導入され始めてい る

Slide 9

Slide 9 text

(C) Link and Motivation Group なぜそんな話をするのか? モチベーションクラウドでは大手顧客対応として 性能改善プロジェクト進行中 9 2019年10月 調査開始 2019年12月 改修も開始 2020年4月 1万人超の顧客でも利用可能に

Slide 10

Slide 10 text

2. 今日のテーマ

Slide 11

Slide 11 text

(C) Link and Motivation Group 今日のテーマ 11 Railsのレールに乗ってたら鈍行だった話 ~ 大量データでもサクサク動くアプリケーションになるために ~ Theme

Slide 12

Slide 12 text

(C) Link and Motivation Group Railsのレールに乗ってたら鈍行だった話 1 問題になった場所 12 1. Railsが非効率な書き方になってる 2. APIから情報返しすぎてる 3. 統計情報を毎回計算してる 4. 非同期処理が直列になってる 5. 大量処理を同期的にやってる 6. ロックでエラーになる

Slide 13

Slide 13 text

(C) Link and Motivation Group Railsのレールに乗ってたら鈍行だった話 1 問題になった場所 13 1. Railsが非効率な書き方になってる 2. APIから情報返しすぎてる 3. 統計情報を毎回計算してる 4. 非同期処理が直列になってる 5. 大量処理を同期的にやってる 6. ロックでエラーになる

Slide 14

Slide 14 text

(C) Link and Motivation Group 今日のテーマ 14 Railsが非効率な書き方になってる ~ 更新編 ~

Slide 15

Slide 15 text

(C) Link and Motivation Group ActiveRecordのvalidation問題 15 N+1問題

Slide 16

Slide 16 text

(C) Link and Motivation Group ActiveRecordのvalidationへの対応 16 一括処理したい部分validation:falseにするorそもそも定義しないで、Validatorを 別途つくる

Slide 17

Slide 17 text

(C) Link and Motivation Group ActiveRecordのvalidationへの対応 17 activerecord-importも使ってクエリの発行数を抑える

Slide 18

Slide 18 text

(C) Link and Motivation Group ActiveRecordのcallback関数問題 18 N+1問題

Slide 19

Slide 19 text

(C) Link and Motivation Group ActiveRecordのcallback関数への対応 19 validationと同様、基本使わずcallbackがかかるようなメソッドを使わない

Slide 20

Slide 20 text

(C) Link and Motivation Group 今日のテーマ 20 Railsが非効率な書き方になってる ~ 参照編 ~

Slide 21

Slide 21 text

(C) Link and Motivation Group ActiveRecordのオブジェクトがでかい問題 21 なにも指定しないと全column取得する ActiveRecordのオブジェクトは単純な数値や文字列よりかなり大きいのでメモリ も逼迫する

Slide 22

Slide 22 text

(C) Link and Motivation Group ActiveRecordのオブジェクトがでかい問題への対応 22

Slide 23

Slide 23 text

(C) Link and Motivation Group n+1問題 23

Slide 24

Slide 24 text

(C) Link and Motivation Group n+1問題への対応 24 includes, preload, eager_loadでクエリをまとめる

Slide 25

Slide 25 text

(C) Link and Motivation Group n+1問題への対応(見つけ方) 25 bullet導入

Slide 26

Slide 26 text

(C) Link and Motivation Group DBのindex問題 26 Rails特有の問題ではないけど、開発初期にリリース重視で開発して ると見落としがち

Slide 27

Slide 27 text

(C) Link and Motivation Group DBのindex問題への対応 27

Slide 28

Slide 28 text

(C) Link and Motivation Group DBのindex問題への対応(見つけ方) 28 1. データベースのslow.logをみる 2. EXPLAINで検証しつつ、適切なindexをはる ※mysqlだとlog_queries_not_using_indexesをONにすればindex を使っていないクエリをslow.logに吐くことができる だれか Gemとか知ってたら逆に教えてください

Slide 29

Slide 29 text

(C) Link and Motivation Group そのほか問題になった場所への対応 29 1. Railsが非効率な書き方になってる 2. APIから情報返しすぎてる 3. 大量処理を同期的にやってる 4. 統計情報を毎回計算してる 5. 非同期処理が直列になってる 6. ロックでエラーになる 設計を変える - 統計テーブル作る - アーキテクチャ変える - テーブルの責任を分離する - indexはる 仕様を変える - pagingする - 非同期にする コードを変える

Slide 30

Slide 30 text

(C) Link and Motivation Group 性能改善プロジェクトをやっていて感じること 30 - コードだけで解決できる問題は少ない 性能改善前、n+1など大量に出ていたのでそれが原因であること が大半だろうと思っていたが、結局DB設計変更しないといけない ケースが3割(工数では5割)をしめた - 設計変えるより仕様変える方が大変 SaaSということもあり、仕様変更は各所への連携など開発外の タスクが増えるので大変 開発初期からpagingなど想定可能なものは対応しといた方がい い

Slide 31

Slide 31 text

3. 最後に

Slide 32

Slide 32 text

(C) Link and Motivation Group 募集職種 下記職種を募集しています 【仕事内容】 ・フロントエンドの設計、開発、計測 ・高速に動作して使いやすく、再利用可能なUIコンポー  ネントライブラリの開発 ・StoryBook, Cypress, webpackなどを利用したフロン  トエンド開発基盤の構築や改善 ・最近取り組んでいること https://qiita.com/advent-calendar/2019/mcs 【必須スキル】 ・SPAのフロントエンドの設計、開発、運用スキル ・AWSやGCPなどのクラウド上でのWebアプリケーショ  ンの開発経験 ・フロントエンドにおけるユニットテスト、E2Eテストの  知識 ・リンクアンドモチベーションのビジョン・ミッションへの共感 ・継続した技術への興味と学習習慣 フロントエンドエンジニア (モチベーションクラウド) 【仕事内容】 ・モチベーションクラウドのAPI、Webアプリケーション  の設計、開発、テスト、計測、運用 ・アプリケーション要件に基づいたアーキテクチャの設  計、ミドルウェアの選定 ・パフォーマンスチューニング、モニタリング環境の構築 ・最近取り組んでいること https://qiita.com/advent-calendar/2019/mcs 【必須スキル】 ・RailsなどのWAFを用いたWebサービスの開発経験 ・AWSやGCPなどのクラウド上でのWebアプリケーションの  開発経験 ・ソフトウェアのパフォーマンスに関する知識 ・リンクアンドモチベーションのビジョン・ミッションへの共感 ・継続した技術への興味と学習習慣 サーバーサイド エンジニア (モチベーションクラウド)

Slide 33

Slide 33 text

(C) Link and Motivation Group 募集職種 下記職種を募集しています 【仕事内容】 ・アプリケーションやミドルウェアの運用 ・アプリケーションに関わるセキュリティの設計と運用 ・開発環境、リリースフロー、テスト環境の整備 ・最近取り組んでいること https://qiita.com/advent-calendar/2019/mcs 【必須スキル】 ・TCP/IP, HTTP などのネットワークプロトコルやアーキテ  クチャに対する理解 ・少なくとも1つ以上の言語を用いたソフトウェア開発経験 ・AWSやGCPなどのクラウド上でのWebアプリケーションの  運用経験 ・Webアプリケーションセキュリティに関する知識 ・リンクアンドモチベーションのビジョン・ミッションへの共感 ・継続した技術への興味と学習習慣 SRE (モチベーションクラウド) 【仕事内容】 ・品質ポリシーの策定 ・開発するサービスやアプリケーションに対するテスト分  析、設計、実装 ・テスト自動化の促進や、開発支援ツールの開発・運用・支  援業務 ・最近取り組んでいること https://qiita.com/advent-calendar/2019/mcs 【必須スキル】 ・ソフトウェア品質やソフトウェアテストに関する知識、経  験 ・ソフトウェアのテスト設計経験 ・テスト自動化(Web/モバイルネイティブアプリケーショ  ン)の知識、経験 ・Webアプリケーションセキュリティに関する知識 ・リンクアンドモチベーションのビジョン・ミッションへの共感 ・継続した技術への興味と学習習慣 QAエンジニア (モチベーションクラウド)