12:00全国のアルバイトやパートの求人情報を提供する「タウンワーク」。フリーペーパーとWebサービスを支えるシステムは10年以上にわたって「保守的な改修による継ぎはぎ」を繰り返し、その結果、広告原稿の入稿処理というシステムの根幹を支えるフローが複雑かつ巨大に成長してしまった。オリンピックイヤーを控える現在、求人広告の掲載数は増加しており、比例して掲載バッチ処理時間は延び、パフォーマンスに著しい劣化が発生。そんな「レガシーコード」に対してシステム全体を俯瞰しながらメスを入れ、2時間かかっていた処理を15分にまで短縮、パフォーマンス改善を実現した。リクルートテクノロジーズの森廣隆行氏は、こなれた手法を駆使して泥臭く奮闘した当時を振り返った。短期・長期のアルバイト・パート情報を扱う「タウンワーク」は、全国の最新の求人情報をフリーペーパーとネットの両方で提供する総合情報サイトだ。最初のフリーペーパーは1998年発行と長い歴史があり、多くの広告主と求人者のマッチングを支えてきた。そんな同サイトにおいて、広告原稿を受注してから掲載するまでのプロセスはビジネスの根幹であり、正確な情報掲載は必須である。その品質を重要視したあまり、新規案件を追加する際の影響範囲を極力閉じようという保守的なマインドに陥り、中間テーブルや類似処理の複製を「新規追加」する方向で対処。その結果、システムは複雑な迷路のまま膨れ上がってしまった。折しもオリンピック需要で掲載数は増加、入稿システム単体に手を入れて個別最適化を試みるも追いつかず、「性能は急激に劣化していった」とリクルートテクノロジーズの森廣隆行氏は明かす。「なんとかしようと、リプレイスやリビルド、アーキテクチャ刷新も検討した」と森廣氏。開発期間が長期に及ぶこの手法では機会損失が大きく現実的ではない。悩んだ末、原稿入稿処理フロー全体にメスを入れ、企画やインフラ担当を巻き込みながら全体最適化を目指す決断をした。原稿情報の入稿ジョブフローを見直した森廣氏は、3つの問題を発見した。原稿情報の入稿ジョブフロー1つ目は、原稿掲載前の原稿データの処理だ。フリーペーパーは月曜に発行されるため、金曜の夕方に入稿を締め切り、そこから印刷、配送を行う。このフローにWebサイト側も引きずられ、毎週日曜夜に1週間分を一気に処理しなければならなかった。3つがあり、特に画像加工やPDF出力、コード変換、連携テーブルへのデータ反映処理を行う「新規掲載」で負担がかかっていた。そこで、こうした編集処理を広告主から入稿があった段階で実施することにした。「工程は1つ増えるが、処理が分散したことで日曜夜の一括処理が軽くなった」2つ目は、原稿入稿システムからタウンワークのシステムに取り込む際の処理だ。「両システムの開発チームがあまり仲良くなくて」と森廣氏は笑いを誘いながら、3つの原稿反映処理の連携がとれておらず、「タウンワーク側は原稿テーブルの既存データをDELETEしてから連携テーブルで受け渡されたデータをINSERTしていた」ことを明かす。この無駄をなくすため、新規掲載(INSERT)、掲載停止(UPDATE)、掲載修正(DELETE→INSERT)に処理を分割、高速化を実現した。両システムをつなぐ連携テーブルで両チームから削除処理が実行される無駄についても、処理をチームで役割分担して排除した。3つ目は、オープンソースの全文検索システム「Solr」へのデータ反映処理だ。原稿テーブルや関連テーブルからデータを抽出、加工して中間テーブルに渡し、Solrのインプットファイルを作成してからCSVに吐き出すという一連の処理で遅延が発生。調査の結果、SQLが重くなっていることが分かり、森廣氏はチューニングをすることにした。EXISTSなどの使用関数や参照テーブルを見直すなどを実施した。これらは一筋縄ではいかなかった。「歴史を感じる500行超えのSQL」はネストを繰り返すJOINテーブルが大量に存在し、テーブル自体も大きすぎて読み込みやI/Oコストも急増。そこで森廣氏はネストを減らしながら、条件を絞り込むことでJOINする数も減らしてI/Oコストを削減した。結果、66万近くあったI/Oコストを約42万にまで減らすことに成功し、さらにSolrのインプットファイル作成の部分を並列化した。これでなんとかなるか。期待した森廣氏だったが、実行時間は2時間から1時間40分に変わっただけ。「なぜだ......」森廣氏は再度調査に乗り出した。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。