SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
PHPからgoへの移行で分かったこと
Report
gree_tech
Follow
gree_tech
Dec. 2, 2019
•
0 likes
•
6,280 views
1
of
39
PHPからgoへの移行で分かったこと
Dec. 2, 2019
•
0 likes
•
6,280 views
Download Now
Download to read offline
Report
Engineering
php conference 2019 で発表された資料です。 https://phpcon.php.gr.jp/2019/
gree_tech
Follow
gree_tech
Recommended
マイクロにしすぎた結果がこれだよ!
mosa siru
132.2K views
•
32 slides
本当は恐ろしい分散システムの話
Kumazaki Hiroki
678.2K views
•
70 slides
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
Amazon Web Services Japan
3.6K views
•
102 slides
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
172.2K views
•
16 slides
小さなサービスも契約する時代
Ryo Mitoma
6.4K views
•
51 slides
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
NTT DATA Technology & Innovation
12.7K views
•
35 slides
More Related Content
What's hot
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
53.5K views
•
243 slides
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
123.8K views
•
33 slides
分散システムについて語らせてくれ
Kumazaki Hiroki
119K views
•
45 slides
Dockerからcontainerdへの移行
Kohei Tokunaga
16.3K views
•
36 slides
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
15K views
•
20 slides
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
52.3K views
•
21 slides
What's hot
(20)
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
•
53.5K views
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
•
123.8K views
分散システムについて語らせてくれ
Kumazaki Hiroki
•
119K views
Dockerからcontainerdへの移行
Kohei Tokunaga
•
16.3K views
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
•
15K views
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
•
52.3K views
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
Recruit Lifestyle Co., Ltd.
•
15K views
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
•
23.1K views
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
•
9.8K views
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
•
23.1K views
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
•
56.2K views
AWSのログ管理ベストプラクティス
Akihiro Kuwano
•
76.7K views
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
•
3.6K views
脱RESTful API設計の提案
樽八 仲川
•
13.9K views
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
Yoshiki Hayama
•
50K views
DeNAのインフラ戦略 〜クラウドジャーニーの舞台裏〜 [DeNA TechCon 2019]
DeNA
•
24.4K views
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
•
14.5K views
こわくない Git
Kota Saito
•
878.5K views
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
•
20.3K views
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
•
52.1K views
Similar to PHPからgoへの移行で分かったこと
エンジニア以外の方が自らSQLを使ってセグメント分析を行うカルチャーをどのように作っていったか
gree_tech
1.5K views
•
45 slides
概説 Data API v3
Yuji Takayama
1.6K views
•
46 slides
Spath for enterprise
Koichiro Sumi
746 views
•
26 slides
公式部活動技術書典部の活動紹介
gree_tech
1.9K views
•
22 slides
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
Rikitake Oohashi
6.8K views
•
91 slides
NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」
アシアル株式会社
1.3K views
•
42 slides
Similar to PHPからgoへの移行で分かったこと
(20)
エンジニア以外の方が自らSQLを使ってセグメント分析を行うカルチャーをどのように作っていったか
gree_tech
•
1.5K views
概説 Data API v3
Yuji Takayama
•
1.6K views
Spath for enterprise
Koichiro Sumi
•
746 views
公式部活動技術書典部の活動紹介
gree_tech
•
1.9K views
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
Rikitake Oohashi
•
6.8K views
NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」
アシアル株式会社
•
1.3K views
Fluxflex meetup 2011 in Tokyo
Kyosuke Inoue
•
648 views
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
Serverworks Co.,Ltd.
•
18.2K views
fluxflex meetup in Tokyo
Kyosuke Inoue
•
688 views
JAWS-UG山形 AWSのきほん 2016/11/12
Gyori Nagafuchi
•
1.3K views
おすすめインフラ! for スタートアップ
Koichiro Sumi
•
1.6K views
はじめよう!PowerAppsキホンのキ kintone × Microsoft Flow / Logic Appsの話
典子 松本
•
6.5K views
ハイブリッドアプリ開発最前線から見たHtml5の理想と現実
Monaca
•
5.5K views
HTML5 クロスプラットフォームアプリ開発の現実解
Monaca
•
3.9K views
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
DIVE INTO CODE Corp.
•
246 views
Emacs softLayer
Shuichi Yukimoto
•
926 views
[CTO Night & Day 2019] グローバルのサービス展開に向けたマルチリージョンアーキテクチャ- #ctonight
Amazon Web Services Japan
•
1.8K views
Hadoop/Spark セルフサービス系の事例まとめ
Yuta Imai
•
2K views
マーケティング的視点で見る コミュニティ育成 アマゾン データサービス ジャパン 小島 英揮氏 資料
Peatix Japan
•
3.6K views
TensorFlowで訓練したLINE BotをAWS Lambdaで動かしてみた
Van Huy
•
4.9K views
More from gree_tech
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
gree_tech
698 views
•
36 slides
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
gree_tech
222 views
•
13 slides
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
gree_tech
1K views
•
18 slides
アプリ起動時間高速化 ~推測するな、計測せよ~
gree_tech
1.8K views
•
84 slides
長寿なゲーム事業におけるアプリビルドの効率化
gree_tech
341 views
•
116 slides
Cloud Spanner をより便利にする運用支援ツールの紹介
gree_tech
587 views
•
31 slides
More from gree_tech
(20)
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
gree_tech
•
698 views
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
gree_tech
•
222 views
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
gree_tech
•
1K views
アプリ起動時間高速化 ~推測するな、計測せよ~
gree_tech
•
1.8K views
長寿なゲーム事業におけるアプリビルドの効率化
gree_tech
•
341 views
Cloud Spanner をより便利にする運用支援ツールの紹介
gree_tech
•
587 views
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
gree_tech
•
585 views
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
gree_tech
•
613 views
海外展開と負荷試験
gree_tech
•
586 views
翻訳QAでのテスト自動化の取り組み
gree_tech
•
295 views
組み込み開発のテストとゲーム開発のテストの違い
gree_tech
•
547 views
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
gree_tech
•
206 views
データエンジニアとアナリストチーム兼務になった件について
gree_tech
•
298 views
シェアドサービスとしてのデータテクノロジー
gree_tech
•
425 views
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
gree_tech
•
958 views
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
gree_tech
•
1K views
比較サイトの検索改善(SPA から SSR に変換)
gree_tech
•
664 views
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
gree_tech
•
2.6K views
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
gree_tech
•
385 views
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
gree_tech
•
743 views
PHPからgoへの移行で分かったこと
1.
Copyright © LIMIA,
Inc. All Rights Reserved. PHPからgoへの移行で分かっ たこと PHP Conference 2019発表資料
2.
Copyright © LIMIA,
Inc. All Rights Reserved. ● グリーグループのリミア株式会社で、LIMIA という住まい領域のメディア を作っています。ゲーム会社ですが、最近はメディアに力を入れていま す。 ● 機械学習(RecSys)のエンジニアですが、iOS, Android,JSなどもやってい る何でも屋です。5歳の娘のパパ。twitter: @mahiguch1 ● GCPのイベントでAWSの話をしたら、Googleの担当営業の方から呼び 出されました。w ● https://limia.jp/ ● https://arine.jp/ ● https://aumo.jp/ ● https://www.mine-3m.com/mine/ Masahiro Higuchi/樋口雅拓 2
3.
Copyright © LIMIA,
Inc. All Rights Reserved. グリーグループ公式部活動とし て技術書典部を立ち上げ、合同 誌を作って頒布しました。 次の合同誌を制作着手してお り、技術書典8にもサークル参加 予定です。 企業部活動として技術書典7にサークル参加 3
4.
Copyright © LIMIA,
Inc. All Rights Reserved. オフィスが新宿に移 転しました。最大190 名収容可能な勉強会 スペースがあります。 社内外の勉強会を開 催できたらと思ってい ます。 松屋自販機もありま す! 最高すぎる勉強会スペースと松屋自販機 4
5.
Copyright © LIMIA,
Inc. All Rights Reserved. 弊社では、PHPシステムの一部をgoで書き換えました。その経験から学んだことについ て、以下の構成で発表します。 • 移行前後のWebシステム構成 • Pythonからgoに移行した推薦システム • PHPエンジニアがgolangを学ぶ時にハマりがちなこと • golangに移行して良かった点 • 改めて分かったPHPの良さ アジェンダ 5
6.
Copyright © LIMIA,
Inc. All Rights Reserved. 移行前後のWebシステム構成
7.
Copyright © LIMIA,
Inc. All Rights Reserved. LIMIAとは? 7 ● メディアサービス ● Android, iOS, Web ● 記事一覧を表示し、タップすると 記事詳細を閲覧できる。 ● 記事一覧はパーソナライズ。 ● 記事詳細読了後に関連記事を出 している。 ● Fuel PHP/EC2, go/ECS ● 分析基盤はBigQuery
8.
Copyright © LIMIA,
Inc. All Rights Reserved. ● EC2の上にfpmを乗せて。 ● MySQL/Memc/Dynamo ● Fuel PHP つまり、どこにでもあるシンプルなシステム。 移行前のシステム 8
9.
Copyright © LIMIA,
Inc. All Rights Reserved. ● 最近バージョンアップの話を聞かない ● Githubを確認すると、最後のcommitが2018年5月 ● Laravelに行く? いや、コンテナ考えたらgolangでしょ! → PHPをgolangで書き換えてしまおう! 移行の動機 Fuel PHPが。。。 9
10.
Copyright © LIMIA,
Inc. All Rights Reserved. • PHP vs go: 基本はPHP。goのマイクロサービスを作り少しづづ処理を寄 せていく。 • https vs grpc: 型の問題が度々発生していたので、grpcで。 • EKS vs ECS: インフラ工数が取れないため、まずはお手軽なECSで。 • Envoy vs NLB: 同じく、まずはお手軽なECSで。 (比較レイヤーが異なるため、登壇後記載削除) 技術選定 10
11.
Copyright © LIMIA,
Inc. All Rights Reserved. NLB経由でgoにアクセス。 MySQLは両方から。 APIを一つづつ移行していく。 移行後のシステム 11
12.
Copyright © LIMIA,
Inc. All Rights Reserved. ● PHPからMemcacheへは、ConsistentHashを使って直接アクセスして いた。 ● goからも同様にMemcacheへアクセスしたところ、ライブラリが異なるた め、ConsistentHashが合わない! → 仕方がないので、MemcacheへアクセスするだけのECS Service(go)を 作って、必ずそこを通すようにした。 システム構成ハマりポイント(1) MemcachedのConsistentHashが合わない 12
13.
Copyright © LIMIA,
Inc. All Rights Reserved. Memcacheが辛すぎるので、MySQL/Memcachedへ のアクセスをgoに閉じ込めたい。 API部分をgoで実装する。 WebはLaravelコンテナをECSで動かし、APIを叩いて データを取得する。 システム最終形予想図 13
14.
Copyright © LIMIA,
Inc. All Rights Reserved. ● 基本文法は自習。書籍を読んだり、playgroundで試したり。 ● システム構成などを座学で毎日1時間x2週間。 ● Build用コンテナやMakefileを整備した。 これで、書こうと思えば書けるレベルに。 (だけどPHPで書いた方が早い) Golangトレーニング PHPerのみでバックエンドを書いていた 14
15.
Copyright © LIMIA,
Inc. All Rights Reserved. ● UnitTestだけでなく、APIの結合テストもFuel phpのテストを書いてい た。 ● レスポンスのIFをかなり網羅していたので、リファクタのときには重要。 ● GitのDevelop branchにmergeされるとJenkinsでテストが走り、成功 したら結合テスト環境に配布していた。 —> 実装完了してmergeしたらテストが失敗。何故!? システム的なハマりポイント(2) テストが失敗する 15
16.
Copyright © LIMIA,
Inc. All Rights Reserved. ● Jenkins Slaveは、EC2にphpをインストールしてテストを実行していた。 ● 当然だがgolangコンテナが無いので、接続失敗でテストがコケる。 ● Jenkins Slave専用にECS Service建てるのは、もったいないよねー。 —> 開発環境用に作ったdocker-composeをJenkins Slaveの中に立 ててしまおう! システム的なハマりポイント(2) テストが失敗した理由 16
17.
Copyright © LIMIA,
Inc. All Rights Reserved. Repository構成 ● docker: docker-compose.ymlなど ● app: PHPで書かれた本体 ● api: golangで書かれたマイクロサービス これまでは、Jenkinsにgithubのtokenとrepository pathを登録しておくと、手元に 展開されていた。 Repositoryが3つだとScriptの所でgit cloneを3行書く。—> Permission Denied... あれ? どうやってtoken渡そう。—> .netrcに書くことで解決! システム的なハマりポイント(2) 第1の関門: git tokenの渡し方 17
18.
Copyright © LIMIA,
Inc. All Rights Reserved. ● 1つ目のテストは成功したが、別のテストで失敗。 ● コンテナが立てっぱなしだったので、ポートを取れなかった。 ● 80/tcp —> 8080/tcp(dockerのNginxが動くport)に透過させていたのが原 因。 —> テストの開始時にdocker-compose up、終了時にdocker-compose downすることで解決。 システム的なハマりポイント(2) 第2の関門: コンテナの建て方 18
19.
Copyright © LIMIA,
Inc. All Rights Reserved. ● しばらくうまく動いていたが、突然テストが失敗するように。 ● Jenkins Slaveでコンテナの更新を行なっていなかった。 ● テスト開始前にdocker-compose pullしたが上手くいかない。あれ? —> ecr loginしてなかったので、docker repos.にアクセスできていな かった。loginすることで解決。 課題も解決し、処理の一部がgoで動き始めました。 システム的なハマりポイント(2) 第3の関門: コンテナの更新 19
20.
Copyright © LIMIA,
Inc. All Rights Reserved. Pythonからgoに移行した 推薦システム
21.
Copyright © LIMIA,
Inc. All Rights Reserved. 起動直後の一覧表示。興味関心に合わせたものを掲載 すれば、使いやすいアプリになるのではないか。 そう考え、記事の推薦システムを開発中でした。 → これもgolang化してしまおう! 記事のベクトル化、ユーザのベクトル化、掲載リストの生 成の3点について、golang化したシステムの解説を行い ます。 概要 21
22.
Copyright © LIMIA,
Inc. All Rights Reserved. ItemとUserの距離を計算し、近い物を出す。 ただし、全記事との距離をリアルタイムに計算 すると遅いので、分類して中心点との距離を計 算することにした。クラスタ内での順位はCTR を使った。 記事の推薦 22
23.
Copyright © LIMIA,
Inc. All Rights Reserved. 記事が更新されると、 SQSに通知されます。そ れをLambdaで読み込ん で、単語に分割し、単語を vectorにします。記事に 含まれる単語の平均を記 事のvectorとします。ただ し頻出単語の影響緩和の ため、IDFで補正します。 アイテムベクトル作成 23
24.
Copyright © LIMIA,
Inc. All Rights Reserved. ユーザが記事を閲覧すると、その情報がKinesisに流れます。Lambdaで受け取 り、直近30件の閲覧履歴をDynamoDBに保存します。その変更をDynamoDB Streamに流し、Lambdaで受け取って記事のベクトルの平均をユーザベクトルと してDynamoDBに書き込みます。 これで推薦システムもgolang化することができました。 ユーザベクトル作成 24
25.
Copyright © LIMIA,
Inc. All Rights Reserved. PHPエンジニアがgolangを学 ぶ時にハマりがちなこと
26.
Copyright © LIMIA,
Inc. All Rights Reserved. ● リクエスト単位 PHP: static → go: context ● 長期: PHP: apc → go: static すぐ消えると思ってstaticに入れたらOOMになった。。。orz キャッシュの持ち方 26
27.
Copyright © LIMIA,
Inc. All Rights Reserved. type Person struct { Name string Age int } func (p Person) ToString() string { return fmt.Sprintf("%s: %d", p.Name, p.Age) } class xx {}みたいに書くのではなく、funcの直後に書く。 関数名の先頭が小文字だとprivate、大文字だとpublic。 classをどう書けば良いのか interfaceに足を生やす 27
28.
Copyright © LIMIA,
Inc. All Rights Reserved. // 単純に投げると、待たずに終わってしまう。 concurrent := make(chan struct{}, 5) for i := start; i < end; i += step { concurrent <- struct{}{} go func(startAt uint64, endAt uint64) { service.CreateByRange(startAt, endAt) }(i, i+step) } 並列数制限 こういうケースだと別ファイルにしてsystem()で起動していた。 28 // 当たり前だが、並列数制限して待つ必要がある。 var wg sync.WaitGroup concurrent := make(chan struct{}, 5) for i := start; i < end; i += step { wg.Add(1) concurrent <- struct{}{} go func(startAt uint64, endAt uint64) { defer func() { wg.Done() <-concurrent }() service.CreateByRange(startAt, endAt) }(i, i+step) } wg.Wait() // 待つだけだと、限界まで起動しちゃう。 var wg sync.WaitGroup for i := start; i < end; i += step { wg.Add(1) go func(startAt uint64, endAt uint64) { defer func() { wg.Done() }() service.CreateByRange(startAt, endAt) }(i, i+step) } wg.Wait()
29.
Copyright © LIMIA,
Inc. All Rights Reserved. golangに移行して 良かった点
30.
Copyright © LIMIA,
Inc. All Rights Reserved. 【コンテナサイズ】 ● PHP: 1,500MB ● go: 150MB 【インスタンスサイズ】 ● PHP: 4CPU/8GB ● go: 2CPU/8GB 開発系実験結果。コンテナサイズは小さくなる。CPUは少し軽くなってそう。メモ リはキャッシュを載せているので、ほとんど変わらない。 登壇後追記: 不要なファイルを削ればPHPのコンテナサイズは、200MB程度 になりそう。 コンテナサイズ/CPU使用量が小さい 30
31.
Copyright © LIMIA,
Inc. All Rights Reserved. goはコンパイルが必要なので、ビルドエラーになってくれる。 これまでは、123を文字列で返して結合検証で見つかることが多かった。 テストから書けば問題ないが。。。 型安全 31
32.
Copyright © LIMIA,
Inc. All Rights Reserved. みんな新しいものが好きなので。 API速度改善という名目でgo lang対応を挟むと気分転換になる。 最新技術を使っている気がしてモチベーションが上がる 32
33.
Copyright © LIMIA,
Inc. All Rights Reserved. 改めて分かったPHPの良さ
34.
Copyright © LIMIA,
Inc. All Rights Reserved. shuffleとかexplodeとか、自分で書かなきゃいけないの??? → はい。そうです。 これは書いていて、PHPが懐かしくて仕方なくなった。 標準クラスの充実 34
35.
Copyright © LIMIA,
Inc. All Rights Reserved. goには、それっぽいのがあまりない。 仕方がないから自作したけど、これで良かったのか。。。 Laravelにしておけば良かったと。 フレームワークが充実 35
36.
Copyright © LIMIA,
Inc. All Rights Reserved. gopherまじ本当いない。募集しても全く応募がない。感覚的にはPHPの 1/100程度。 PHPerはgoに興味を持っている人が多いので、やるならPHPerを採用してgo をトレーニングした方が良さそう。 (登壇後記載削除) 採用 36
37.
Copyright © LIMIA,
Inc. All Rights Reserved. 終わりに
38.
Copyright © LIMIA,
Inc. All Rights Reserved. ● WebはPHPで書いた方が早い。 ● 推薦システムはPythonで書いた方が早い。 ● 安定的なシステムを作る場合、golangが早い。 当たり前だが適材適所に使うのが良い。 WebはPHP(Laravel)に、推薦システムはPythonに戻す予定。 お気付きの点がございましたら懇親会で教えてください。 まとめ 38
39.
Copyright © LIMIA,
Inc. All Rights Reserved. グリーグループ及びリミアでは、一緒にメディアを作っていく仲間を募集中で す。興味のある方は、以下のサイトをご覧ください。 http://corp.gree.net/jp/ja/recruit/ https://www.wantedly.com/companies/limia ご静聴、ありがとうございました。 We are hiring! 39