aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

サーバサイド開発で使用している技術を紹介

f:id:aptpod-tetsu:20211208151334j:plain

aptpod Advent Calendar 2021の13日目を担当する製品開発グループの塩出です。 動画関連のハードウェア開発を行なっていくうちにサーバサイドの開発に惹かれ、昨年の10月ごろにハードウェアの開発からサーバーサイドの開発へジョブチェンジしました。Advent Calender1日目の記事で紹介のあった、ハードウェアエンジニア→サーバサイドエンジニアの事例の人です。

サーバサイドは未経験だったのでキャッチアップは大変ですが、知らない技術にたくさん触れることができとても充実しています。

今回は復習も兼ねてサーバサイド開発で使用している技術を紹介したいと思います。

使っている技術一覧

分類 項目
言語
RDB
PostgreSQL
時系列データベース
ストレージ
AWS S3
ミドルウェア
NATS Streaming        
仮想化技術
ソースコード管理
CI GitLab CI
Document作成 f:id:aptpod_tech:20211210173747p:plain
f:id:aptpod_tech:20211210173252p:plain
プロトコル iSCP on QUIC, iSCP on Websocket
アーキテクチャ マイクロサービス
実行基盤
AWS, GCP, Azure, オンプレ
認可制御 OAuth2.0

製品のサーバーアプリケーションは100%Go製です。また、マイクロサービスを採用しており各アプリケーションへのリバースプロキシには Traefikを採用しています。認可制御はOAuth2.0を採用しています。

各アプリケーションの開発は基本的にDocker環境で行い、CIでのテストで問題なければ AWS上にある開発環境にデプロイする流れで開発を進めています。ただ、アプリケーション自体は実行基盤に縛りがないようにしています。

RDBはPostgreSQLMySQLに対応していましたが、両方対応するメンテコストの削減のため現在はPostgreSQLのみになりました。

エッジから送信される計測のデータ点を時系列で格納するために、InfluxDBを採用しています。

Golangでの開発

分類 項目
実装方針 クリーンアーキテクチャ
タスクランナー Makefile
O/Rマッパー GORM
Webフレームワーク gorilla, chi, Gin
テストツール Dredd
ソースコード管理 GitLab
CI GitLab CI
エディタ VS Code, Vim

サーバアプリケーションはクリーンアーキテクチャを取り入れて実装しています。クリーンアーキテクチャ自体は色々ネットに良い記事たくさん出ているので、ここではその詳細は省略します。クリーンアーキテクチャを採用すると複雑になる DI(Dependency Injection) の解決には wireを使用しています。

webフレームワークは gorilla, chi, Gin などを採用しています。サービスごとで差がありますが、なるべく標準準拠なものに寄せていきたい想いがありゆくゆくはGinの採用をやめるかもしれません。

テストはユニットテスト、結合テストの他に API Documentとの整合性チェック用で Dredd のテストを実施しています。

使用するエディターに縛りはありませんが、 社内のサーバサイドエンジニアはVS Code派とVim派しかいないようです。なお、VS Codeの方が人口多めで、筆者もVS Code派です。

ソースコードの管理はGitLabで行っており、MR (マージリクエスト)のレビューは基本的にそのリポジトリオーナーがやっています。案件によってはリポジトリオーナー以外もレビューを行います。

おまけ

開発の進め方

分類 項目
開発フレームワーク スクラム開発
タスク管理 JIRA, GitLab issue
設計ドキュメント作成 Confluence
コミュニケーションツール Slack, Google Meet
リリースサイクル 四半期に一度

弊社は四半期に一度製品リリースを行なっているので、期の終わりごろまでに設計を行なって期の頭から中頃までに実装、QA中に次の期の設計を開始するという感じで開発を進めています。

実装のフェーズでは、スクラム開発を採用して進めています。といっても、ガチガチのスクラムではありません。1スプリントは1週間で、スプリントの最初にプランニング(そのスプリントで行うタスクの内容共有)を行い、実装を進めていきます。そして毎日15分程度の会議の中で進捗確認や、困りごとの共有などを行なっています。コロナの影響で基本的に在宅勤務なので、会議はGoogle Meetを使用して基本的にオンラインで行っています。また、会議以外にもSlackで困りごとの相談を随時行っています。

レビューは毎スプリントごとではなく、ある程度の見せられる成果物が出来上がるころにプロダクトオーナーを交えて行っています。

サーバサイドに異動してから関わった案件

未経験でしたが色々な案件に携わることができ、良い経験をさせてもらいました。以下に約1年間で関わった案件を列挙します。

  • メディアサービスのスケールアウト設計、実装
    • メディアサービスはH.264をHLS形式で配信する機能や、H.264をブラウザアプリケーションにリアルタイムに転送する機能を有しています。
  • 認証認可サービスのモデル変更の実装
    • 文字で書くと簡単そうですが、かなり大幅な改修でした
  • 次期iSCPのClient, Serverの実装
  • マルチテナント化の実装

さいごに

最後まで読んでいただきありがとうございました。技術紹介を通してどのような感じで開発をしているのか少しでも伝わったら幸いです。

この記事を読んで弊社での開発に興味を持った方、もっと詳しく話を聞きたいと思った方はぜひ採用ページからエントリーをお願いします。