YAPC::Hokkaido 2016 SAPPORO
YAPC::Hokkaido 2016 SAPPORO
10年モノ熟成Perlとの付き合い方
2016/12/10
アイランド株式会社
中川 勝樹 (@ikasam_a)
YAPC::Hokkaido 2016 SAPPORO
自己紹介
☃ 中川 勝樹
☃ アイランド株式会社 (2016/07/01-)
☃ @ikasam_a
☃ github.com/masaki
☃ metacpan.org/MASAKI
1
YAPC::Hokkaido 2016 SAPPORO
会社紹介
2
www.ai-land.co.jp
YAPC::Hokkaido 2016 SAPPORO
アイランドのライフスタイルメディア
3
「おとりよせネット」
otoriyose.net
「レシピブログ」
recipe-blog.jp
YAPC::Hokkaido 2016 SAPPORO
We’re hiring!
☃ エンジニア募集しています!
4
https://www.wantedly.com/projects/72445
YAPC::Hokkaido 2016 SAPPORO5
YAPC::Hokkaido 2016 SAPPORO
Food Service Engineers Meetup (ロゴ募集中)
6
YAPC::Hokkaido 2016 SAPPORO7
「おとりよせネット」
otoriyose.net
「レシピブログ」
recipe-blog.jp
13年 11年
YAPC::Hokkaido 2016 SAPPORO8
over 10 years
YAPC::Hokkaido 2016 SAPPORO9
Language < System
YAPC::Hokkaido 2016 SAPPORO
レシピブログのシステム概要
☃ FastCGI (Perl 5.10 + 独自WAF)
☃ Apache 2.2
☃ PostgreSQL 9
☃ Elasticsearch
☃ File Cache + memcached (2016/10~)
☃ CloudFront
10
YAPC::Hokkaido 2016 SAPPORO
おとりよせネットのシステム概要
☃ CGI (Perl 5.10)
☃ Apache 2.2
☃ PostgreSQL 9
☃ File Cache / Page Cache
☃ + CloudFront (2016/11~)
11
YAPC::Hokkaido 2016 SAPPORO
技術・設計課題
☃ 利用技術の陳腐化
❄ CGI、FastCGI、…
☃ 開発環境や開発プロセスの停滞
❄ 「運用でカバー」
☃ そろそろモノリシックの規模も課題に
12
YAPC::Hokkaido 2016 SAPPORO
熟成した問題
☃ 独自WAF利用とその聖域化問題
❄ メンテナンスやアップデートが行き届かず
❄ 手の入れ方がわからず運用でカバー
❄ 秘伝のタレ化
☃ 掃除不足によるゴミ屋敷問題
❄ 不要なソースコードが残ったまま
❄ 不要なファイルが残ったまま
❄ 次第に影響範囲が不明になり消せなくなるパターン
13
YAPC::Hokkaido 2016 SAPPORO
どう向き合うか?
☃ 背景を理解する
☃ 事実を把握する
☃ 改善する
☃ 革新を起こす
14
YAPC::Hokkaido 2016 SAPPORO
背景理解
☃ とにかくコードを読む
❄ (個人的に)Perl でよかった
☃ 疑問や経緯はわかるまで全部聞く
❄ 今目の前にある事象は、過去の決定の積み重ね
❄ 当時は何らかの意図や判断が必ずある
☃ 「システムに歴史あり」
❄ ここまで事業を支えてきた事実をリスペクトする
❄ その上で諦めてきたことを知ろう
15
YAPC::Hokkaido 2016 SAPPORO
事実把握
☃ ログをどんどん出す
❄ 手がかりは多く、余れば後で捨てるだけ
❄ carp, croak → cluck, confess
❄ $logger->warn($@)
☃ リソースを監視する
❄ 推測するな、計測せよ
❄ CloudForecast 入れるところから始めた
16
YAPC::Hokkaido 2016 SAPPORO
[改善] WAFの改修
☃ コードを読んだ結果、普通に改修可能になった
❄ (個人的に)Catalyst ライクな WAF でよかった
☃ 運用でカバーしていた部分が根本的解決へ
☃ 結果、コード自体もシンプルでスリムに
17
YAPC::Hokkaido 2016 SAPPORO
[改善] パフォーマンスチューニング
☃ ログとリソースグラフのおかげ
☃ ログに DB の max connection エラーを発見
❄ DB チューニングで max connection 確保
☃ まだ HTTP リクエストがタイムアウトしてた
❄ TCP connection / HTTP がある値で頭打ちになってた
❄ ServerLimit, MaxClients 周りを設定
☃ 残るは DC 帯域が…(共用なので)
18
YAPC::Hokkaido 2016 SAPPORO
[改善] TV露出の対応
☃ TV (地上波) で取り上げられると即死(30分落ち)
☃ 「来週ヒルナンデスに出ます」という死の宣告
☃ 画像が豊富でページ当たりの転送量が…
❄ とりあえず CloudFront 載せよう
☃ アセットが世代管理されてないからキャッシュが…
❄ mod_ext_filter っぽいのを書いた
☃ CGI プロセスが膨大に…
❄ SpeedyCGI (!) を引っ張りだした
❄ 参照系はことごとく静的に HTML 化
19
YAPC::Hokkaido 2016 SAPPORO
[革新] AWS導入
☃ 抜本的に環境を変える
❄ 改善だけじゃ解決しきれない問題もある
☃ ついでに残った問題も解決する
❄ ドサクサに紛れて色々仕込む
20
YAPC::Hokkaido 2016 SAPPORO
[革新] システムリプレース
☃ 抜本的に(ry
☃ ついでに(ry
21
YAPC::Hokkaido 2016 SAPPORO
なぜ革新なのか
☃ ワクワク感が出る
❄ 楽しさはモチベーションの源泉
❄ 「やるからには面白く、工夫して」© 2016 @ikasam_a
☃ 本当は色々狙ってる
❄ 大きな変化を伴わないと解決できない問題に向き合う
❄ 今ある他の課題も一緒に解決できる方法を考える
❄ 両立できる施策をしれっと狙う
♨ 理想(革新)だけ追っても色んな意味で難しい
22
YAPC::Hokkaido 2016 SAPPORO
まとめ
☃ アイランドではおやつにローストビーフが出ます
☃ 10年過ぎると色んなところに地雷がありますが、こうなる
に至った当時の判断背景が必ずあります
☃ ここまで継続させてきた先駆者の実績をリスペクトしま
しょう
☃ 背景を理解した上で事実を知れば、どうやって対応して
いけばよいのか見えてきます
23

10年モノ熟成Perlとの付き合い方