1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#からGoに一部リプレースして得られたこと

Last updated at Posted at 2025-12-07

この記事はReviCo Advent Calendar 2025 の8日目の記事です。

はじめに

この記事では、ReviCoでバックエンドのAPIサーバーをC#からGoに一部リプレースした経緯と、それによってどのような効果があったのかについて解説します。

ReviCoのバックエンド事情

まず、ReviCoでのバックエンド事情について説明します。
ReviCoではバックエンド開発のプログラミング言語として主にC#、JavaScript(Node.js)を採用しています。割合としてはC#がほぼ9割を占めている状況で、今回のテーマになっているAPIサーバーはすべてC#で書かれています。
インフラの実行基盤としてはAWSのECS(Fargate)とAPI Gatewayの二つを採用しており、どちらの基盤もC#で開発したプログラムをコンテナ化して動かしています。APIの比率としては、ECS(Fargate):API Gateway = 8:2ぐらいでほとんどのAPIサーバーはECS(Fargate)で動かしています。
※以降は簡略化のため、ECS(Fargate)をECS、API GatewayをAPIGWを表記します。

動機

リプレースを検討した動機としては、大きくインフラコストの削減とパフォーマンスの改善の2つになります。

まず一つ目のインフラコストの削減としては、ECSとAPIGWのどちらもインフラコスト増の悩みを抱えていました。

ECSのコスト増加の要因は、APIサーバーのコンテナ数(正確にはECSタスク数)の増加です。ReviCoではマルチテナントアーキテクチャを採用しています。マルチテナントアーキテクチャのメリットとしては、インフラリソースを複数のテナントで共有することによってコスト最適化が見込める点ですが、テナント数の増加に伴って、コンテナ数も線形的に上がっている状況が続いており、マルチテナントアーキテクチャの恩恵を十分に享受できてない状況が続いておりました。
またAPIGWのコストについても、リクエスト数の増加によって上昇しておりました。課金体系としてはリクエスト数課金のため、適切にCDNキャッシュを踏まえてコストをコントロールする必要があるのですが、トラッキング系のPOSTのAPIが週単位で1億リクエストほど呼ばれていることもあり、こちらもコストを逼迫しておりました。

2つ目のパフォーマンスの改善については、主にECSに関することです。コスト増にも関連するのですが、日々の調査のなかでC#のスレッドプール枯渇によって同時アクセスによるスループット低下が原因であると分かるようになりました。そのためスループットを向上させることができれば、より少ないコンテナ数でリクエストを捌けるようになるので、結果としてコスト削減にも繋がると考えました。

なぜGoを選択したのか

ECSで動かしているAPIサーバーのパフォーマンス改善のため、よりスループットの向上が見込める言語としてGo言語を選定しました。
具体的にはメモリ効率の良さとゴールーチンによる並行処理の強さに惹かれ、開発者体験やリリース体験も踏まえて良い言語だと判断しました。
また自分がプライベートでGo言語を触っていて愛着があったことも選定理由です。

実際にどのようにリプレースしたか

今回リプレースしたAPIは、APIGWで動かしているトラッキング系のPOSTのAPIです。
スループット向上を目的にするならば、ECSのAPIをリプレースすることが理にかなっているとは思うのですが、今回は以下の理由からAPIGWのAPIをリプレースすることにしました。

  • キャッシュの効かないPOSTメソッドをECSへ移行することによって大幅なコスト削減が見込めるため
  • まだGo言語が動くかが不透明で、ロジックが複雑なECSのAPIをリプレースするのは不安だったため

Go言語で再実装したAPI(GoAPI)は実行基盤としてはECSを選択しました。
リプレースにあたっては、GoAPIのリリースと、フロントエンドでAPIGWのAPIを呼んでいた箇所をGoAPIに向き先を変更するリリースを同時に実施しました。ただし、予測不可能なエラーが出る可能性を考慮して、GoAPIが500エラーとなった場合に既存のAPIを呼び出すようなフォールバック処理を入れました。

どのような効果があったのか

APIGWのコストを約30%ほど削減

リプレースにより、APIGWのコストが大幅に削減することができました。また、同様なリクエストをGoコンテナ数台で捌けるようになったため、追加分のGoのECSのコストも加味すると30%低下/日ほど削減できました。
cost.png

スループットの改善

スループットについては、今回リプレースしたAPI自体がECS(Fargate)のAPIではなかったのと、そこまで多くの処理を必要とするAPIではなかったため、劇的な効果を感じたわけではなかったです。今後、ECS(Fargate)側のAPIをリプレースしていくうえで計測していきたいです。

おわりに

いままで利用したことのないGo言語を実践投入したことで、思った以上のコスト削減ができ、私としてもとても満足しています。このような大胆なチャレンジを見守ってくださった上司のかなっぺさんにも心から感謝しています。今後も常識破りで大胆なチャレンジをやっていきたいと思っています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?