Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

RSSリーダーサービスのバックエンドAPI

Notifications You must be signed in to change notification settings

XRayZen/feedays_cloud

Repository files navigation

FeedaysのバックエンドAPI

  • このプロジェクトは開発しているRSSリーダーサービスのサーバーレスなバックエンドAPI部分です
  • サーバーサイドの言語にGoを採用しており、SQLはGORMを使用しています。
  • 関数コードをドッカーコンテナにしてECRにプッシュしてLambdaで動かしています
  • インフラはAWSを採用しており、APIGW+Lambda+RDSProxy+RDS
    • IaCはTerraform+Terragruntを採用しており、開発・運用を見据えて開発環境・本番環境を切り替えることが出来ます

AWSクラウド構成

APIGW->Lambda(Go)->RDSProxy->RDS(MySQL)

  • DBパスワードはIaCでランダム生成してAWS SecretMangerに入れて管理しています

以下使用技術一覧やコンセプト

  • ラムダ動作言語: Go (Ver.1.20.5)
    • 実行速度などでもっとも効率がいい言語はRustだと思うが、Goが一番バックエンドとしてデファクトになりつつあるので、Goを採用
    • Rustと似たような書き方・文法なので簡単に(一週間程度で)習得ができた
  • IaC: Terraform+Terragrunt(IaCの保守・運用性を効率的にするツール)
    • 素のテラフォームだとフォルダ分け・DRYがしづらいなど使い心地・保守・可読性が悪いのでTerragruntを採用
    • これにより、素のテラフォームだと出来ない/しずらいフォルダ分けやDRYが出来るようになり、保守性・可読性が大きく向上
  • API定義言語: OpenAPI
    • AppSyncやGraphQLを使うという選択肢もあったが、密結合や学習コスト等を考えて、一番ハードルが低いであろうOpenAPIを採用
    • API定義言語にそこまでのコストを払えないと判断
  • データベースアクセス: GORM(ORM)
    • データベースアクセスにはもっともメジャーなGORMを採用
  • データベース: MySQL(Ver.8.0.31)
    • ポートフォリオとしてメジャーなSQLエンジンであるMySQLを採用

機能一覧

  • ユーザー登録・ログイン
  • QRコードで設定を同期
    • マルチプラットフォームで同じサービス体験をするためにQRコードで設定を同期する
    • QRコードを読み込んだら、そのコードに紐づく設定を読み込んで返信
  • アクティビティ(ユーザー行動履歴)の登録
    • 後々サービスを改善する為に履歴を蓄積する
  • サイト登録・編集・削除
  • サイトのフィード取得/更新(バッチ処理)
    • フィードの更新はバッチ処理で行う
  • サイトのランキング集計(実装予定)
    • 国ごとのランキングを取得する
  • サイトのトレンド集計(実装予定)
    • 記事・サイトのトレンドを取得する
  • コンテンツ検索
    • 記事タイトル・サイト名で検索する
    • 後々マネタイズする為にアカウントタイプによって動作を変える
  • Explore Categoryの取得
    • サイトのカテゴリごとリストを取得する

工夫したところ

  • APIの機能を大きく四つ程度のLambda関数に分けて、リクエストタイプに応じてより細かく処理を分けることで、Lambda関数のコードをシンプルに保つことが出来た
    • これにより、Lambda関数のコードがシンプルになり、可読性が向上した
    • また、DIを導入することで、テストコードの実装がしやすくなった
  • DBへの変更にはトランザクションを使うことで、データの整合性を極力保つことを意識した
    • 途中でエラーが出てもロールバックしてデータの整合性を保ちつつ、エラーを返すことが出来る

苦労したところ

  • データベースの設計
    • データベースの設計は初めてだったので、どのように設計すれば良いのか悩んだ
      • データ型・正規化・アンチパターンなどの知識が必要だったので、それらの知識を学習する必要があった
    • ググりまくりながら、情報をマークダウンでプログラミングノートに書き溜める事で、データベースの設計とその知見を得ることが出来た
  • Lambdaを使ったAPIのテスト・デバッグ
    • Lambdaを使ったAPIのテスト・デバッグは初めてだったので、どのようにテスト・デバッグすれば良いのか悩んだ
    • RDSも使っているのでローカルでは十分テストは出来ない
    • そこで、ローカルでSQL(DB操作)関連のテストする際はRDSからSQLiteに切り替えてテストすることで、RDSのコストを抑えつつテストを行うことが出来た
    • APIGW+Lambda+RDSの統合テストは実際にインフラをデプロイして
      • テスト専用のクライアントアプリを作って、そこからAPIを叩くことでテスト・デバッグを行うことが出来た

CI/CD(Github Actions)

  • ラムダ関数のCI/CDはGithub Actionsで行っています
  • サービス全体のCI/CDは実装予定

開発環境構築

Dockerfileで開発コンテナを記述してVSCodeのRemote Containerで開発環境を構築しています。

バックエンド開発に際してのプログラミングノート

ER図

PlantUMLでER図を作成しております

ER図

About

RSSリーダーサービスのバックエンドAPI

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /