プロジェクトの背景と開発方針

広告配信システムプロジェクトの管理システム担当として参画しました。長期にわたり技術支援を行うこととなりました。
行った技術支援は以下になります。

  • 管理画面用バックエンドAPIの新規開発
  • 一括入稿CSV取り込みバッチの新規開発
  • 配信サーバー、バッチの開発(引き継ぎ)
  • 各種機能追加、障害対応、バージョンアップ対応、脆弱性情報ハンドリング等

開発のポイント

管理画面用バックエンドAPIの新規開発

広告主様用の管理画面(SPA)のバックエンドAPIの新規開発を担当しました。DB設計とAPI設計はある程度終わっており、APIの数は50個程度となります。

言語はGolangで、その他のコード構成等はおまかせするとのことでした。結果としてHTTPフレームワークには最も知名度のあるechoを、ORMには軽量なgorpを採用しました。採用する際には実際にコードを組んでみて完成後をイメージしながら、性能やメンテナンス性が確保できるかどうかを確認しました。

またコード構成をDBアクセスレイヤーとAPIレイヤーに分け、それぞれテストコードも実装しました。DBアクセスレイヤーではDBクエリの入と出を、APIレイヤーではHTTPのリクエストとレスポンスを確認するテストになりました。今回のように規模が大きなプロジェクトではテストコードの整備も効果的になってきます。

いくつかのAPIをサンプルとして実装し他のメンバーに確認していただいたあと、残りのAPIを実装していきました。APIの数が多く、他のメンバーに手伝っていただきながら何とかスケジュール通りに実装を終えることができました。

一括入稿CSV取り込みバッチの新規開発

広告主様は管理画面から1つ1つ広告を追加・変更することができますが、CSVをアップロードすることで複数の広告を一括入稿することもできます。このCSVを取り込むバッチを新規作成しました。

大量の広告を取り込む必要があり、10万件で1時間以内という要件が示されました。また大量の取り込み処理を行うにはエラー処理やロールバックの仕組みも必要です。これを実現するために以下のような施策を行いました。

広告を論理単位に分ける

広告を論理単位(グループ)に分割し、その単位でロールバックや並列処理を行うようにしました。

これにより一部のエラーのために全体がロールバックされてまた何十分もかけてやり直すといったことがなくなります。またこの論理単位毎に並列処理化することで速度向上も見込めます。

登録処理の前にチェック処理を行う

登録処理に入る前の段階として、CSVの書式チェックを設けました。

何十分も掛けて最後の箇所でエラーになるよりも、もっと早い段階でエラーが分かるほうが利用者にとって便利だからです。このため最初の段階で可能な限りエラーを検出できる形にしました。

Dockerによる実行環境の統一

今回、プロジェクト全体としてDockerを採用し、開発環境、本番環境ともにDocker上で動作する形としました。これにより両環境で動作の差異がなくなり、開発生産性が向上しました。

また開発環境はVSCode + devcontainerを採用し、WindowsでもMacでも同一の環境を簡単に構築できるようにしました。これにより新規メンバーが参加する際も開発環境構築に時間を取られることがなくなりました。

振り返り

広告配信システムの開発という貴重な体験を得ることができました。広告業界の知識も得られました。

また今回Golangを初めて本格的に使う機会となりました。Golangはビルド速度が早く、またネイティブコードを出力するため起動速度も早いです。エラー処理周り等はまだ言語として発展余地がありますが、今後も積極的に使っていきたいと思いました。

プロジェクトデータ

開発期間
-
開発人数
6人

使用技術

言語
Golang, TypeScript
Framework
echo, gorp, Angular
データベース
MySQL
画像アップロード
AWS S3
ホスティング
AWS EC2, AWS Batch等