2019年5月21日

手続きガイドのパフォーマンス向上

手続きガイドの全般的な動作速度を向上させるため、プログラムコード全般の見直し、データベース切替などのシステム改修・改善を行いました。

システムに関する知識がある方向けの内容にはなりますが、行った改修について簡単にご紹介します。興味のある方はご覧ください。


基本コンセプト:IOバウンドな処理を排除する

手続きガイドは、「ユーザーが回答した結果」から、「必要な手続き」を洗い出すシステムです。したがって、内部的には、「すべての質問」と「すべての手続き」をマトリクス状にならべ、双方の紐づきをデータとして表現する必要があります。

そのようなマトリクス状のデータを用意した上で、いただいた回答結果とそのデータを突き合わせ、どの手続きが必要かを特定し、次に出す質問を選ぶ、といった演算処理を行う、というのが手続きガイドの内部実装の概要です。

従来型の手続きナビゲーションは、データを作成する際に質問の順番までをあらかじめ定義して、フローチャートのようにまとめるものが多いようです。しかし、質問の順番まで制御しようとすると、データを作成する難易度はどうしても上がります。

そこで当社の手続きガイドでは、データ作成者は質問順については一切考える必要がなく、システム側が適切な質問を、所定のアルゴリズムに従って導き出すように作りました(実際には、このデータは単一のエクセルシートとして表現できるので、データを作成・メンテナンスするのが容易であるように工夫されています)。

このようにして作成されたマトリクス状のデータを使った演算は2次のloop処理になります。したがって、パフォーマンス上の要請から、そのままでは疎なマトリクス状のデータを圧縮してloop数を減らしつつ、loop内部に待ち時間を発生させるネットワーク / ディスクIO処理を入れない事が重要となります。

さらに、そのような演算結果をもとに、必要な情報を整理・加工してユーザーのみなさんのお手元に届ける過程でもパフォーマンスを落としがちな様々な処理が挟まっています。

今回の改修では、処理の過程で挟まれるネットワークIO及びディスクIOを従来よりさらに大幅に減らしてパフォーマンスを高めることを主眼にリファクタリングを行いました。


データベースの移行

上記のコンセプトを達成するためには、コードの見直しだけでなく、そもそも論としてデータをどのように保持するかも重要になります。

一般的に業務システムで使われるのはリレーショナルデータベース(RDBMS)ですが、RDBMSでマトリクスデータを扱おうとすると、マスター系のテーブルを複数用意した上で、さらにそれらマスター間のマッチングテーブルを用意し、複数のテーブルにまたがってデータを結合処理することが多くなります。

プログラムを書く際には、こうしたRDBMSを使うと、たとえばORMなどの機能を使って、裏側で行う結合処理をほとんど意識しなくて済みます。

しかし、それこそが盲点です。

気軽に書いたコードが大量の結合処理を生み、それがDBに負荷をかけ、また大量のネットワークIOを生むといったことはありがちな間違いです。手続きガイドは当初からそのようなことがなるべく少ないように設計してはいましたが、それでも複雑なコードのあちこちにネットワークバウンドな処理が含まれていました。

実際、従来型の手続きガイドの応答時間の大半は、データベースアクセスによるネットワークIOが占めていました。

今回はそうした問題を一掃するため、RDBMSからドキュメントデータベースへ移行するという選択を取りました。これにより、ドキュメントの取得を一度行うだけで、その後、ほぼDBアクセスをしなくても処理を行えるようにできました。

それでも、まだまだ改善の余地がありそうなので、引き続きパフォーマンスの改善には継続的に取り組んでいきます。


移行にまつわるテスト

データベースの移行や大規模なリファクタリングを行う際に、サービスに予期せぬ不具合が起こることがあります。

ウェブサービスでは、ネットワークの信頼性が低く、サイトにアクセスするユーザーの端末の問題もあるので、不具合を完全になくすことは難しいです。それでも、サービスを提供する側に起因する不具合は可能な限り事前に発見し、解決しなければなりません。

今回のサービス改修においては、従来から行ってきた自動化テストのケースをさらに拡充し、画面表示などUI部分に与える影響も含めて幅広く問題を発見できるようにしました。

従来からInterfaceを駆使した疎結合な構造化を徹底して推し進めていたため、ユニットテストについては比較的しやすくなっていましたが、UIコンポーネント単位でのレンダリングテストや、e2eテストなど、様々な手法を織り交ぜて総合的なテスト品質を保つべく努力しています。


「見えないUX」も改善し続ける

ほとんどのサービスにおいて、「使い勝手の改善」「UXの見直し」というと、実際にユーザーの方が利用する画面の改善だと思われることが多いようです。

しかし、サービスの応答速度、性能、メンテナンスのしやすさ、テストケースの網羅性・妥当性といった要素もまた、サービスの品質を決定づける要因となります。

開発チーム一同、ユーザーの皆様の目に触れる・触れないにかかわらず、サービス全般の品質を着実に高め続け、多くの方の手続きを便利にしていきたいと思っています。

引き続き、手続きガイドをよろしくお願いいたします。