Slide 1

Slide 1 text

BIやめて カスタム開発に 移行した話 アクセンチュア株式会社 宮川 俊樹

Slide 2

Slide 2 text

• 宮川 俊樹 • アクセンチュア歴 約4年 • 前職 インターネット系の広告代理店でWEBアプリエンジニア4年半 自己紹介 Copyright © 2019 Accenture. All rights reserved. 2

Slide 3

Slide 3 text

• アクセンチュアでの仕事 最初2年 • 要件定義やったり設計やったり運用やったり ここ2年 • 2年のブランクを経て開発にも手をのばす 自己紹介 Copyright © 2019 Accenture. All rights reserved. 3

Slide 4

Slide 4 text

• アクセンチュアでの仕事 最初2年 • 要件定義やったり設計やったり運用やったり ここ2年 • 2年のブランクを経て開発にも手をのばす 自己紹介 Copyright © 2019 Accenture. All rights reserved. 4 今日はここの話

Slide 5

Slide 5 text

事件勃発 Copyright © 2019 Accenture. All rights reserved. 5 社⾧ 分析システムが遅くて使い物にならない! 今すぐ速度改善をしろ!

Slide 6

Slide 6 text

• 大手小売業向け分析システムの開発 • 日々の売上の推移 • 商品別・商品カテゴリ別の売上分析 • 顧客の性別・年代別の売上分析 • 顧客の住所別の売上分析 • 新規客・離反客の分析 • この商品を買った人が他に何を買っているかという分析 • データ量は5000万~1億件/日 そもそもどんなプロジェクトか Copyright © 2019 Accenture. All rights reserved. 6

Slide 7

Slide 7 text

• 一番一般的な日々の売上の推移で15秒程度 • 複雑な分析になると10分以上 どのくらい遅かったか Copyright © 2019 Accenture. All rights reserved. 7

Slide 8

Slide 8 text

• 一番一般的な日々の売上の推移で15秒程度 ⇒ データ量も多いし、適切なデータマートも作っているが、確かに遅い。 • 複雑な分析になると10分以上 ⇒ 内容によっては10分以上かかるのはやむを得ない。 ただ、その間ずっと画面を開いておかなければいけないのはいただけない。 どのくらい遅かったか Copyright © 2019 Accenture. All rights reserved. 8

Slide 9

Slide 9 text

Copyright © 2019 Accenture. All rights reserved. 9 当時の構成 WEBサーバ (PHP + jQuery) BIサーバ (Business Objects) DWH (Greenplum Database) REST APIリクエスト SQL問合わせ 結果返却 グラフを画像で出力

Slide 10

Slide 10 text

Copyright © 2019 Accenture. All rights reserved. 10 何が起こっていたか 14.81秒

Slide 11

Slide 11 text

Copyright © 2019 Accenture. All rights reserved. 11 何が起こっていたか 14.81秒 クエリが14本 しかも直列

Slide 12

Slide 12 text

Copyright © 2019 Accenture. All rights reserved. 12 何が起こっていたか 14.81秒 クエリの結果をBI側で結合

Slide 13

Slide 13 text

• BIの撤廃 • 結合処理はDWH側で実行 • 並列に実行可能なクエリは並列に実行 • 時間のかかる分析は予約機能化 どうやって改善したか Copyright © 2019 Accenture. All rights reserved. 13

Slide 14

Slide 14 text

• BIの撤廃 • フロント+REST APIの構成にする チームの学習コストを考慮し難易度が低そうなフレームワーク/ライブラリを選択 • Vue.js(Nuxt.js) • chart.js • PHP どうやって改善したか Copyright © 2019 Accenture. All rights reserved. 14

Slide 15

Slide 15 text

• 結合処理はDWH側で実行 • PHPの役割はできるだけ少なくする セッション管理 GETのパラメータとログインユーザからSQLを生成・実行 どうやって改善したか Copyright © 2019 Accenture. All rights reserved. 15

Slide 16

Slide 16 text

• 並列に実行可能なクエリは並列に実行 • JavaScriptのaxiosを利用 アプリケーションサーバに向けて並列にREST APIリクエストを投げることで、SQLを並 列で実行 どうやって改善したか Copyright © 2019 Accenture. All rights reserved. 16

Slide 17

Slide 17 text

• 時間のかかる分析は予約機能化 • 分析実行ボタンを押すと非同期でバッチサーバがEXCELまたはCSVを 作成し、あとでダウンロードしてもらう形式に変更 Vue.jsなどを利用したが想定していたほどチームの学習コストが大きくなかったので、 バッチはkotlin(Spring batch / doma2)にチャレンジ どうやって改善したか Copyright © 2019 Accenture. All rights reserved. 17

Slide 18

Slide 18 text

18 システム構成 クライアントイントラネット Docker 加盟店 ユーザ 認証 HTTPS データマート (Greenplum) WEBサーバ (nginx) 認証用リバースプロキシ (apache) 認証サーバ (Tomcat) 認証サーバ用 モジュール ドメイン振り分け用 リバースプロキシ (nginx) HTTP auth.xxxx.net JavaScript (Vue.js, chart.js) APPサーバ (PHP-fpm) PHP レポート作成用 バッチサーバ kotlin (spring batch, doma2) HTTP stat.xxxx.net gis.xxxx.net HTTP stat.xxxx.net Unix socket keycloak EXCEL レポート JDBC レポート 配置 PDO Amazon Elastic Container Registry AWS CodeCommit AWS Cloud プロキシサーバ

Slide 19

Slide 19 text

Copyright © 2019 Accenture. All rights reserved. 19 結果 14.81秒から3.16秒に(4.7倍高速化) 3.16秒 並列実行

Slide 20

Slide 20 text

• chart.jsに代わるグラフライブラリを見つけたい • APIサーバもkotlinにしたい • CodeBuildでちゃんとCIを回したい 今後の展望 Copyright © 2019 Accenture. All rights reserved. 20

Slide 21

Slide 21 text

• chart.jsに代わるグラフライブラリを見つけたい • chart.jsはグラフをクリックしてドリルダウンとかグラフのそばに数値を記載 するのが困難という問題があった。 • D3.jsとかamChartsとか調査してみたい。 今後の展望 Copyright © 2019 Accenture. All rights reserved. 21

Slide 22

Slide 22 text

• APIサーバもkotlinにしたい • チームの学習コストを気にしたが、意外とkotlinでも問題なかった。 • Vue.js(nuxt.js)でも、関数言語っぽい書き方してるから? 今後の展望 Copyright © 2019 Accenture. All rights reserved. 22

Slide 23

Slide 23 text

• CodeBuildでちゃんとCIを回したい • 今はCodeCommitで資源管理しかしてないが、CodeBuildでテスト・ ビルドを自動化したい。 • CDはクライアントのネットワークがクローズドでイントラネットから外部への アクセス(ホワイトリストベース)しかできないので難しい。 今後の展望 Copyright © 2019 Accenture. All rights reserved. 23

Slide 24

Slide 24 text

Copyright © 2019 Accenture. All rights reserved. 24 おわり