Aipoの技術スタックをご紹介します。Aipoはチームのスケジュール共有を素早くかんたんにするBtoB向けのスケジュール管理SaaSです。出勤したらブラウザを立ち上げてAipoを開いて予定を確認する、という使われ方をするため平日の日中にアクセスが集中します。チャットによるメッセージ送信や予定時刻のリマインダー送信などリアルタイム性も求められます。そんなプロダクトの特性にあわせて最適な技術を選定し、改善を行っています。
技術の選び方
私たちは次のような方針で技術選定をしています。
プロダクトの成長につながるかどうか
技術はあくまで “手段” なので、プロダクトの成長につながるかどうかを最優先で考えて選定をしています。新しい発明は行わず、サービスの中核となるビジネスロジックに集中できる構成を心がけています。1,700社 30,000人以上が使う基盤となるため、スケーラビリティも考慮しています。最終的には大きく使うシーンを思い描きながらも、まずは小さく取り入れて検証してから全体に展開していく、という手法を取ることでインパクトを最小限にしています。
技術スタック
ここからは技術スタックをご紹介します。
サーバーサイド
サーバーサイドはJavaを利用しています。リマインダーの配信など一部のバッチ処理ではLambda上でNode.jsを使用しています。どのエンジニアでも対応ができるよう、現時点では極力この2つの言語に集約しています。Javaを選んだ理由は大きく3つあります。
大規模開発でも処理の共通化がしやすい
Aipoにはカレンダー以外にもチャットや掲示板など数多くの機能があり、ファイル保存やデータベースへの書き込みなどの共通する処理、バリデーションルールやデータ登録後のメール配信、プッシュ通知といった機能ごとに異なる処理があります。Javaはオブジェクト指向に優れているため、共通する処理を「継承」や「オーバライド」することで共通部分を活かしながら個別の拡張を行いやすいという特長があります。
大規模開発でも実行速度が速い
大規模になっても実行速度が速いのもJavaのメリットの一つです。
開発者が増えても一定の品質を保つことができる
Aipoではエンジニアのインターンとして50人以上の学生を受け入れてきました。開発に携わるエンジニアの人数が増えても一定の品質を保つために、静的型付け言語であるJavaを選んでいます。
フロントエンド
フロントエンドはVue.js / TypeScriptを利用しています。一部dojoも残っていますが、機能追加のタイミングでVue.jsに移行をしています。
インフラストラクチャー
インフラにはAWSを使用しており、アプリケーションはEC2上のTomcatで動かしています。負荷状況に応じてスケールする設定になっています。アプリケーションサーバーには永続的なデータが残らない設計にすることで可用性を高めています。
セッション管理はDynamoDB、データベースはMySQL、ストレージにはS3を使用しています。
監視
Cloud Watchを使って負荷状況の監視をしています。New Relicではデータベースのボトルネックの洗い出し、JVMの監視をしています。
また、ログイン監視ツールを自作してユーザーの使用感に近い監視を行っています。
開発環境
ソースコードの管理にはGitHubを使用しています。開発環境にはDockerを使ってAWS上の構成を再現しています。
CI/CD
CI/CDにはJenkinsを使用しており、GitHub上でマージするとビルド、テスト環境へのデプロイが自動で走るようになっています。また夜間にコードの静的解析(Findbugs, PMDなど)が走るようになっています。
本番環境へのデプロイはBeanstalkを使ってBlue/Green デプロイをしています。
今後の展望について
キューイングによる負荷分散対応
Aipoにはまだキューイングのしくみがないため、CSVデータ一括ダウンロードなどの重たい処理もリアルタイムで実行してレスポンスを返しています。ユーザーがストレスなく操作できるよう、負荷のかかる処理を順番に実行できるキューイングの導入を検討しています。
CSSライブラリの導入
Aipoはおもちゃのように使いやすいカレンダープラットフォームをめざしています。ユーザーが簡単に使えるためには統一感のあるUIと一貫したUXを効率よく設計できるCSSライブラリの導入が必要だと考えています。今のところVuetifyが最有力候補です。
まとめ
今回はAipoの技術スタックについて現時点の内容を簡単に紹介してみました。
それぞれの技術要素についても今後記事を書いていく予定です。