SupabaseからプロダクションレベルのGoへ:1ヶ月目

2ヶ月前、私はInfo Linksを構築しました。これはLe CNAM Lebanonの学生向けの無料リソースプラットフォームです。300人の学生と50のコースをサポートしています。

当初、バックエンドはSupabaseを直接使用していました。動作はしていましたが、技術面接でその構成を正当化することができませんでした。1ヶ月目の目標は、単にGoの構文を学ぶことではありませんでした。シニアエンジニアが納得するようなシステムを構築することでした。

変更点は以下の通りです:

  • バックエンドをSupabaseのみの構成からGoのREST APIへと移行しました。
  • コードベースは6ファイルから100ファイル以上に増加しました。
  • API、Service、Repository、Middlewareからなるレイヤードアーキテクチャを実装しました。
  • グローバル変数を排除するために、依存性の注入(Dependency Injection)を導入しました。
  • 自身の選択を説明するために、6つのArchitecture Decision Records (ADRs)を記述しました。

新しい構造は、明確なパスに従っています: HTTP request → Router → Handler → Service → Repository → Postgres.

以下の要素を追加することで、プロダクション環境への対応に注力しました:

  • slogによる構造化ロギング。
  • ヘルスチェックとメトリクス。
  • 不正利用を防ぐためのレート制限。
  • race detectionとリンティングを備えたCI。
  • マルチステージのDockerビルド。
  • 高いテストカバレッジ(APIで93%、Serviceで96%)。

また、k6を使用して負荷テストも行いました。APIに対して毎秒4,400リクエストを送信したところ、レートリミッターが1ms未満で過剰なトラフィックをブロックしました。システムがクラッシュすることはありませんでした。

大きな教訓の一つは、AIの使い方に関する自分なりのルールです。私は毎日45分間、AIを使わずに作業する時間を設けています。この時間を使って、コードのリファクタリングを行ったり、ファイルの内容を声に出して説明したりしています。もし自分で説明できないのであれば、それはリリースしません。これにより、「動く」ことと「なぜ動くのかを理解している」ことの間の溝を埋めています。

エンジニアリングがミッションに見合うものになりました。製品は引き続き学生向けに無料で提供されますが、バックエンドは今や技術面接で通用するレベルに達しています。

来月は、goroutineとcontextを使用してリンクの健全性をチェックする、コンパニオンGoサービスを構築する予定です。

ライブサイト: infolinks.app GitHub: github.com/MohamadObeid9/Info_Links Telegram: @Info_Links9

ソース: https://dev.to/mohamadobeid9/from-supabase-only-to-production-go-month-1-of-rebuilding-info-links-3a4p