## プロジェクトの概要
見込み顧客を管理するSaaS型のプロダクトを企画開発・保守運用するプロジェクトです。
ベータリリースから契約社数が二桁台に増加するまでの 0.5 → 10 あたりのフェーズに携わりました。
また、開発手法にはスクラムを採用しており、1週間スプリントで企画や開発、改善を回していました。
## 担当領域について
開発チームは2~6名規模で、そのなかで自分の役割はフロントエンド・バックエンド・AWSのインフラを横断して開発するフルスタックエンジニアでした。
少人数チームということもあり、開発以外にもプロダクトに関する業務には手広く関わっていました。具体的には以下です。
- 企画途中段階のアイテムを具体的な要件に落とし込んでいくリファインメントをFigmaやMiroを使いながらPO, デザイナ, 他エンジニアと行う
- チームのエンジニア採用に参加し、求める候補者像の定義からスカウト、実際の面接に至るまでコミットする
- (開発の周辺領域ですが、)機能を実現するために新たなアーキテクチャなどが必要になる場合は、設計をし、必要であればDesign Docを書き、他エンジニアと議論して仕様を固める
- プロダクトを安定稼働させるために監視やバグ通知などの仕組みを導入・運用
## 技術的なアピール点
大小様々な機能を開発しましたが、主要なものとしては、メール配信機能とそのメールのトラッキング状況(開封・本文中のURLクリックなど)を表示する機能を開発しました。
メール配信機能に関してはSendGridというメール配信SaaSを組み込んでSidekiqでジョブとしてSendGridのSDKを利用することである程度簡単に実現することが出来ましたが、トラッキング機能の開発に以下の懸念がありました。
- トラッキングはSendGrid側に登録したWebhook URLに都度通知としてリクエストが来る形
- プロダクトを使うエンドユーザーがこの機能を利用するため、事前に何通送信するか想定できない
- 主にマーケティング目的で利用するというところで、一度の配信につき数千〜数万のメールを送信する(≒それに比例した量のWebhookリクエストが発生する)
これらの懸念から、以下の課題が導出されました。
- シンプルにWebhook用の受け口をアプリケーションに用意すると、大量のWebhookリクエストがアプリケーションの負荷を急激に高めてしまう懸念
- 上記のためにオートスケーリングを施すことは出来るが、プロダクト本体ではなくWebhookを受けるためにオートスケーリングするいびつなアーキテクチャになる上に、シンプルにコストがかさむ
- もしオートスケーリングが適用されきる前に大量のWebhookリクエストがアプリケーションに投げられると、コネクション待ちによるタイムアウト、もしくはエラーやメモリ不足によるプロセスの終了が考えられ、そうなった時に投げられていたリクエストの通知データを消失してしまう
そこで、この解決策としてWebhookを受け止めるためのサーバーレスアーキテクチャを設計・構築しました。
このアーキテクチャの流れとしては、
- AWS APIGatewayでWebhookリクエストを受け止め、
- Lambdaにリクエストを渡し、
- LambdaがSQSにキューとしてリクエストのデータを流すことで、
- DynamoDBにデータをバックアップしながら、
- アプリケーションのDBとして用いているRDSにデータを追加していく
ような形です。
これによって、高可用性、高信頼性、バックアップデータ、DBコネクションのリトライ処理、低コストによる実現など様々な恩恵を受けられ、無事にアプリケーションの主力機能のひとつとしてリリースすることができました。