本プロジェクトではサーバーサイドのテックリードとサービス全体のアーキテクトの役職を担っていました。
新規開発においてもなるべく、保守性を低下させないような設計や実装をチーム全体で心がけるようにしました。
## 保守作業
元々、負荷対策などを考慮せずに作られていたシステムがコンテンツ増加による負荷増加でシステムダウンすることが増えたために、負荷対策を実施しました。
- MySQLからデータを全件取得している部分をページング
- 不要なレコードの定期削除
- デッドコードの洗い出しと削除
- プロセス内でデータを共有することでのキャッシュ
- memcachedを用いたキャッシュ
- 検索機能にElasticSearchの導入
- MySQLのスロウクエリの改善
現在はほとんど負荷によるシステムダウンは発生せず、高い稼働率を保っています。
## 運用業務
ビジネスチームからエンジニアチームへの作業依頼が多く、開発の業務効率が落ちていたので、作業依頼を整理し、
- 自動化できるものを自動化
- 管理画面で解決できるように機能追加
- どうしてもエンジニアの稼働が必要なものについてはリファクタリングで開発工数削減
を行い、開発効率の低下を予防しました。
また、例えばフォーマット化された画像の大量生成、登録という業務はビジネスチームの工数を大きく消費していたので、画像生成システムと登録システムを作り工数削減をしました。
## 新規機能開発
単純に作るだけだと、現状のシステムが膨れ上がりメンテナンスのしにくい巨大なモノリスになるため設計部分から工夫してモノリス化を防ぎつつ開発をしました。
### EC機能
EC機能を追加するときに、決済の仕組みはコアサービスと同じトランザクションで実施したかったので既存のシステムに実装し、商品管理や販売者の管理は別のモジュールに切り出して実装しました。
### 配信専用の別アプリケーション
OpenAPIの仕組みを実装し、別アプリケーション特有の実装は完全に別のモジュールとして実装、運用し、必要な情報の提供、操作の権限をOpenAPIで提供しました。これにより開発チームも完全に別々で動けるためお互いに開発がスムーズでした。OpenAPIを利用する機会はなんどもありましたが提供するというのは初めてでした。cpanで提供されているライブラリを用いて実装しましたが、知識も必要な分野であったのでLineやTwitterなどを参考にしました。
### 動的要素を含んだページのS3ホスティング
WEBページをvue.jsで実装しAmazon S3でホスティングしました。このときにページの中にコアサービスの動的な情報を埋め込みたく、その情報を返すサービスをgolangとFargateで実現しました。動的といってもリアルタイム性がそこまで求められるものでなかったのでCDNでのキャッシュを組み込みFargateへの負荷は低く保っています。また一部のデータ生成にLamdaも使っています。
### ストリーミング配信システムのリニューアル
配信システムをリニューアルするにあたって、徐々に入れ替える戦略をとることにしました。そのため、一時的に新旧のシステムが共存することになりました。また既存の仕組みは年期の入った複雑なものになっていました。これを改修して二つのシステムを共存させることは難しく、現実的でなかったため、配信システムとWEBサービスを繋ぐ仕組み部分を完全に再実装しました。もともと手続き型で実装されていたのをオブジェクト指向で書くようにし、二つのシステムの使い分けにはStrategyパターンとTemplate Methodパターンを参考に実装しました。