社内のCRM(顧客関係管理)システムの機能強化の一環として、社内の様々なサービスから利用されるマイクロサービスを構築しました。このマイクロサービスはCRMのキャンペーンを行うための機能を有していて、性質上、大量のリクエストを高速に処理することが求められました。そこで、要件を満たすための技術検証を行った上で、Go + gRPCというスタックでマイクロサービスを構築しました(インフラは Docker + Amazon EKS、DBはSQL Server)。
このプロジェクトにおいては、プロジェクトマネジメントと開発の面で課題がありました。
プロジェクトマネジメントについては、 (1) 当初マネージャとして予定されていたエンジニアが、異動によって参加できなくなったこと (2) 当初のスケジュールでは2019年3月に着手して、7月のサービスインを予定していたが、ビジネス要件を満たすためには6月の早い段階でのサービスインが必要になったこと という2点の課題がありました。
(1) のマネージャの異動については、私がマネジメント(スケジュール管理、各事業部との調整等)を引き受けることで対応しました。これに伴い、当初2名予定だったプロジェクトが1人プロジェクトになりましたが、早期に技術検証と基本設計を完了させたため、スケジュールの遅延は回避できました。
(2) のスケジュール短縮については、マイクロサービスの開発自体はそれほど問題にはなりませんでしたが、各サービスへのgRPCクライアントの組み込みにおいて問題が発生しました。当初は各サービスを担当するエンジニアにgRPCクライアントの組み込みを依頼する予定でしたが、開発リソースの問題でこちらの希望したスケジュールでは作業が完了できないサービスがあったため、私の方でクライアントの組み込みを行い、サービスの担当エンジニアにレビューを依頼しました。これにより、開発期間の短縮とコードの品質維持の両立を図りました。
開発の面では、社内でGoやgRPCを利用したプロジェクトはすでにあったものの、Goの知見のあるエンジニアが退職していたり、gRPCはプロダクションに未投入だったりと、社内のメンバーの力を借りながらプロジェクトを進めることは難しい状況でした。そこで、Goについては社内のナレッジ強化のために勉強会を開催し、その中で自分もGoの理解を深めました。gRPCについては、実装には支障なかったものの、本番投入後にロードバランシングの問題(HTTP/2のコネクションが維持されるため、ALBのようなL7のロードバランサが使えない)が発生しました。社内の技術基盤チームと相談した上で、Envoyを使用することで、gRPCでもロードバランシングを行えるようにしました。
開発の結果、t3.small 2台相当のリソースで、最大300req/seq程度のリクエストを、平均10ミリ秒、99パーセンタイルで200ミリ秒のレスポンスタイムで処理できるサービスが実現できました。
また、キャンペーンを通した売り上げの向上や、従来よりも柔軟なキャンペーンの作成が可能になったことによる施策の増加など、ビジネス面でも大きく貢献できたと考えています(このプロジェクトによって、2019年度第1四半期のMVPをいただきました)。