SlideShare a Scribd company logo
1 of 38
Download to read offline
PHP,Go,Elasticsearchによる、
@cosmeを5倍速くする取り組み
istyle.inc KenjiroKubota @PHPConference2018
Profile.
~ 2015/08 istyle.inc
テクノロジー本部 R&D 部技術開発部 チーフエンジニア
久保田 賢二朗
● PHP(Laravel/Phalcon)
● JavaScript(Vue.js/Svelte)
● Golang
● HHVM/Hack
kenjiro kubota
PR.
株式会社アイスタイル
istyle Inc.
インターネットのコスメ情報ポータルサイト
「@cosme(アットコスメ)」
の開発・運営
コスメだけではなくビューティ全般、日本だけではなく世界で"Beauty"に係る人や
企業、個人事業主が活躍できるプラットフォームを作る。
アイスタイルは、「Beauty×IT」の世界ナンバーワンを目指します。
PR.
@cosmeのスマートフォン版
一部ページの速度改善
弊社が掲げているテーマ「1sec」
Webページの表示速度を1秒台にする
とはいえ明確な基準がない
● First Contentful Paint?
● First Meaningful Paint?
● Speed Index?
また、いざ速度改善することになると以下の制約が発生
● CSS、JavaScriptはあらゆるページに適応されているので変更してほしくない
● 運用が大変になるので↑の分離もやらないでほしい
⇒ とにかくサーバーからのレスポンスを速くしよう
弊社における課題
> モノリシックなアプリケーション
様々なサービスを一つのアプリケーションで構成しているため、巨大なコードになってい
る。
> 10年以上運用されているレガシーな環境
コード量が膨大かつ、運用されている中での実行環境やフレームワークのバージョンアッ
プが困難
> 仕様が不透明
コードを読み解かないとわからない仕様が多い。
どうやって速度改善するか?
機能を切り出してアプリケーションを分ける
マイクロサービスアーキテクチャをヒントに「商品」という単位でサー
ビスを切り分け
アプリケーションも新たに刷新。まずはモノリシックなアプリケーショ
ンを分離させる。
ランキング・ブランド・サロン・クーポンetc
商品ページ・クチコミ
現行で動いてるシステムの仕様をそのままに
新規アプリケーションでフルスクラッチ
メリット
● 全く別の実行環境を用意できるので一気にバージョンアップが可能
● 技術選定に幅がある
● 負のコード(設計)に触れることがない
デメリット
● 同じ仕様のものを再開発しなければならない(そもそも仕様がわからない)
⇒ SQLやコードを読み解きながらそのページに必要な処理をひたすら追う
特定のパスへのアクセスはサーバーの向き先を変更
/product/prodcut_id/{id}/top
アプリケーションの構成
フロント API データ
Phalconとは
● PHPフレームワーク
● Zephir/C拡張で記述されていてオーバーヘッドが少ない
● PSR-0/4準拠
● DIコンテナ標準搭載
● PHPフレームワークで実行速度が最速の部類
弊社ではLaravelの事例が多いが、今回は実行速度を優先
それでいてPHPライブラリや知見を生かせるPhalconを採用
goaとは
● GolangのREST-API向けフレームワーク
● Design(Req/Resの定義)からSwagger.jsonを生成できる
● Golangの為、実行速度は速い
弊社のGolang採用事例でも過去何回かgoaは導入されている
フロントとAPI間の開発において、SwaggerUIを実装ベースで
更新できるため今回も採用
Elasticsearchとは
● Elastic社が開発しているオープンソースの全文検索エンジン
● 同社のKibanaという可視化ツールが利用できる
● 高いスケーラビリティ
● 検索速度や分析柔軟性が高い
こちらも弊社では多く採用しています。
高速な検索、スケーラビリティの高さから採用
データの同期
既存のデータベースからのデータ移行
メッセージングシステムを利用して更新を検知
定期的に移行バッチも実行してデータを同期
● 全件同期できるほどのデータ量であれば毎日全件更新
● データが多い場合は毎時で直近1-2時間内に作成・更新されたデータを同期
データの構造に変更が発生した場合
インデックスA
Alias
インデックスB
Alias
Phalconとgoa
REST APIへの実行が直列だとレイテンシが無駄
GuzzlePromiseで並列実行...
UseCase
事前に並列取得し、
各レスポンスをシングルトンオブジェクトで保持
UseCaseB
UseCaseA
UseCaseC
並列取得 個別取得
アノテーションにより事前取得
リグレッション テスト
もちろん従来のアプリケーションと同じ仕様になっている
ようにしなければならない。
● DOMを抽出し、内容を比較
⇒ h1タグに出力された文字列が一致しているか
⇒ htmlのタグのsrcやhrefなどの値が一致しているか
⇒ listタグのn番目の要素は同一か
⇒ レスポンスのステータスコードの比較
etc...
数万ページに対して実施し、表示される要素に変化がない
ことを確認
● 非同期で生成されるDOMは検知できない
⇒ 現状非同期で処理している箇所が少ないので現在は手動
確認(増えたらbehat等を検討)
● 現在でもアップデートを続けて、設定・定義ファイルを読み
込ませて実行できるためどんなサイトにも利用できる
● 需要があればOSS化したい
改善結果
1.1sec 0.2 sec
まとめ
・ロードバランサーを利用して一部ページから切り替え
レガシーなシステムのまま改善するのは大変です。新しい技術の導
入も難しいため、ページ単位でシステムを移行していく。
・画面に必要なデータは高速なデータベースに移す
同じデータベースを使うことも良いかもしれませんが、CQRSの考え
方をヒントにクエリを分離し、ページに読み出すデータは別途速い
データベースに移すことも検討してみてください。
・リグレッションテストは大事
仕様を変更できる場合はよいですが、そのままの仕様で移行すると
なると同一性の担保が大切です。
オンプレからAWSへ移行
thanks:)

More Related Content

What's hot

Mobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshareMobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshareTier_IV
 
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発Kenjiro Kubota
 
Self-Driving System with IoT
Self-Driving System with IoTSelf-Driving System with IoT
Self-Driving System with IoTTier_IV
 
GovTechを加速させるAWS
GovTechを加速させるAWSGovTechを加速させるAWS
GovTechを加速させるAWSTomomiTakei
 
FukuokaDec09
FukuokaDec09FukuokaDec09
FukuokaDec09tengu
 
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていることTier_IV
 
若手勉強会プレゼン 鈴木俊也 Arch for Startup
若手勉強会プレゼン 鈴木俊也 Arch for Startup 若手勉強会プレゼン 鈴木俊也 Arch for Startup
若手勉強会プレゼン 鈴木俊也 Arch for Startup Jun Sato
 
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。Yukio Saito
 
自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介Tier_IV
 
Twilio API 勉強会 Vol.4
Twilio API 勉強会 Vol.4Twilio API 勉強会 Vol.4
Twilio API 勉強会 Vol.4Joohoun Song
 

What's hot (10)

Mobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshareMobilitydev2019 10 31_slideshare
Mobilitydev2019 10 31_slideshare
 
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
 
Self-Driving System with IoT
Self-Driving System with IoTSelf-Driving System with IoT
Self-Driving System with IoT
 
GovTechを加速させるAWS
GovTechを加速させるAWSGovTechを加速させるAWS
GovTechを加速させるAWS
 
FukuokaDec09
FukuokaDec09FukuokaDec09
FukuokaDec09
 
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
自動運転の会社でなぜデータ基盤が必要なのか?そこで今やっていること
 
若手勉強会プレゼン 鈴木俊也 Arch for Startup
若手勉強会プレゼン 鈴木俊也 Arch for Startup 若手勉強会プレゼン 鈴木俊也 Arch for Startup
若手勉強会プレゼン 鈴木俊也 Arch for Startup
 
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。
斉藤之雄 が 公立大学 産業技術大学院大学 で獲得したこと。
 
自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介自動運転技術を活用した運転技能教習システムのご紹介
自動運転技術を活用した運転技能教習システムのご紹介
 
Twilio API 勉強会 Vol.4
Twilio API 勉強会 Vol.4Twilio API 勉強会 Vol.4
Twilio API 勉強会 Vol.4
 

Similar to PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み

業務アプリを安全に効率的に開発・運用するためのポイント
業務アプリを安全に効率的に開発・運用するためのポイント業務アプリを安全に効率的に開発・運用するためのポイント
業務アプリを安全に効率的に開発・運用するためのポイントアシアル株式会社
 
RLSにおけるプロダクト:プロジェクトマネジメント
RLSにおけるプロダクト:プロジェクトマネジメントRLSにおけるプロダクト:プロジェクトマネジメント
RLSにおけるプロダクト:プロジェクトマネジメントItsuki Sakitsu
 
SMBのバックオフィス業務を最適化するAPI連携
SMBのバックオフィス業務を最適化するAPI連携SMBのバックオフィス業務を最適化するAPI連携
SMBのバックオフィス業務を最適化するAPI連携API Meetup
 
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しようMasayuki Abe
 
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編Jiro Hiraiwa
 
Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣アシアル株式会社
 
Onlab presentation 072412
Onlab presentation 072412Onlab presentation 072412
Onlab presentation 072412Hiro Maeda
 
事例で学ぶHTML5スマフォアプリ開発セミナー
事例で学ぶHTML5スマフォアプリ開発セミナー事例で学ぶHTML5スマフォアプリ開発セミナー
事例で学ぶHTML5スマフォアプリ開発セミナーMonaca
 
高いUXをハイブリッド開発で実現するためのポイント
高いUXをハイブリッド開発で実現するためのポイント高いUXをハイブリッド開発で実現するためのポイント
高いUXをハイブリッド開発で実現するためのポイントMonaca
 
スマートフォン開発の事例 Html5開発の導入ポイント
スマートフォン開発の事例 Html5開発の導入ポイントスマートフォン開発の事例 Html5開発の導入ポイント
スマートフォン開発の事例 Html5開発の導入ポイントMasakazu Muraoka
 
2016年度コーポレートフェローシップ活動報告(山本さん)
2016年度コーポレートフェローシップ活動報告(山本さん)2016年度コーポレートフェローシップ活動報告(山本さん)
2016年度コーポレートフェローシップ活動報告(山本さん)Code for Japan
 
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!kitsugi
 
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみるWeb屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみるMasakazu Muraoka
 
ドローン向けソフトウェア事業
ドローン向けソフトウェア事業ドローン向けソフトウェア事業
ドローン向けソフトウェア事業Masayuki Isobe
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座DIVE INTO CODE Corp.
 
javascriptの基礎
javascriptの基礎javascriptの基礎
javascriptの基礎Masayuki Abe
 

Similar to PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み (20)

Gartner summit 2016
Gartner summit 2016Gartner summit 2016
Gartner summit 2016
 
業務アプリを安全に効率的に開発・運用するためのポイント
業務アプリを安全に効率的に開発・運用するためのポイント業務アプリを安全に効率的に開発・運用するためのポイント
業務アプリを安全に効率的に開発・運用するためのポイント
 
RLSにおけるプロダクト:プロジェクトマネジメント
RLSにおけるプロダクト:プロジェクトマネジメントRLSにおけるプロダクト:プロジェクトマネジメント
RLSにおけるプロダクト:プロジェクトマネジメント
 
SMBのバックオフィス業務を最適化するAPI連携
SMBのバックオフィス業務を最適化するAPI連携SMBのバックオフィス業務を最適化するAPI連携
SMBのバックオフィス業務を最適化するAPI連携
 
Go + Pulsar WebSocket APIの利用事例 #pulsarjp
Go + Pulsar WebSocket APIの利用事例 #pulsarjpGo + Pulsar WebSocket APIの利用事例 #pulsarjp
Go + Pulsar WebSocket APIの利用事例 #pulsarjp
 
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう
[okaweb × HTML5 fun] HTML5で人気のAPIを使って 未来価値を創造しよう
 
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編
スマートスピーカーのアプリ・スキルを作ってみた〜エンジニア編
 
Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣
 
Onlab presentation 072412
Onlab presentation 072412Onlab presentation 072412
Onlab presentation 072412
 
事例で学ぶHTML5スマフォアプリ開発セミナー
事例で学ぶHTML5スマフォアプリ開発セミナー事例で学ぶHTML5スマフォアプリ開発セミナー
事例で学ぶHTML5スマフォアプリ開発セミナー
 
高いUXをハイブリッド開発で実現するためのポイント
高いUXをハイブリッド開発で実現するためのポイント高いUXをハイブリッド開発で実現するためのポイント
高いUXをハイブリッド開発で実現するためのポイント
 
スマートフォン開発の事例 Html5開発の導入ポイント
スマートフォン開発の事例 Html5開発の導入ポイントスマートフォン開発の事例 Html5開発の導入ポイント
スマートフォン開発の事例 Html5開発の導入ポイント
 
2016年度コーポレートフェローシップ活動報告(山本さん)
2016年度コーポレートフェローシップ活動報告(山本さん)2016年度コーポレートフェローシップ活動報告(山本さん)
2016年度コーポレートフェローシップ活動報告(山本さん)
 
Example using LattePanda
Example  using LattePandaExample  using LattePanda
Example using LattePanda
 
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!
モバイルファーストで業務効率化! ローカルデータベースが作業員を救う!
 
Smfl20201001
Smfl20201001Smfl20201001
Smfl20201001
 
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみるWeb屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
Web屋という仕事のこれから Web動向からWeb屋に必要な技術を考えてみる
 
ドローン向けソフトウェア事業
ドローン向けソフトウェア事業ドローン向けソフトウェア事業
ドローン向けソフトウェア事業
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座
 
javascriptの基礎
javascriptの基礎javascriptの基礎
javascriptの基礎
 

More from Kenjiro Kubota

Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTipsKenjiro Kubota
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たKenjiro Kubota
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-componentKenjiro Kubota
 
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話Kenjiro Kubota
 
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話Kenjiro Kubota
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理するKenjiro Kubota
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design OdysseyKenjiro Kubota
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-asyncKenjiro Kubota
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装Kenjiro Kubota
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!Kenjiro Kubota
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦うKenjiro Kubota
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離Kenjiro Kubota
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Kenjiro Kubota
 

More from Kenjiro Kubota (15)

gRPC入門
gRPC入門gRPC入門
gRPC入門
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-component
 
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
 
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
 
Introducing hhvm hack-async
Introducing hhvm hack-asyncIntroducing hhvm hack-async
Introducing hhvm hack-async
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 

PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み