SocialDogのサーバレスアーキテクチャ
アーキテクチャの工夫ポイント
私達は、「あらゆる人がSNSを活用できる世界を創る」というミッションを掲げ、国内アカウント数シェアNo.1のSNSアカウントマネジメントプラットフォームSaaS「SocialDog」を開発・運営するスタートアップ企業です。
SNS運用にまつわるさまざまな課題を解決できるSaaSとして「SocialDog」の企画・開発をしています。
創業から8年、日本国内でSNSツールとしてユーザー数シェアNo.1となった今、「対応SNSの拡大」をしつつ、「海外展開」を目指しています。
私が所属するAnalyticsチームは、主にSocialDogプロダクトのSNSアカウント・投稿の分析機能の開発を行なっています。
分析機能はCloud Run、Cloud SQL、BigQuery、Cloud Pub/Sub、Cloud Tasksなどのアーキテクチャを活用しています。
現在のインフラアーキテクチャについて
導入の背景
SocialDogでは、連携されたXアカウントのフォロー・フォロワー情報を取得し、アカウント管理機能を提供しています。
具体的には、以下のような機能があります。
- アカウントを一覧で表示する機能
- アクティブ※1ではないフォローを一覧で表示する機能
- アクティブなフォロー・フォロワーを検索する機能
※1: 最短で直近3日以内に投稿をしている場合をアクティブと判定
SocialDogで扱うデータでは、フォロー・フォロワーの傾向としてフォロワー数がフォロー数を上回るという特徴がありました。 上記機能の中で最も重視されていたのが「アクティブではないフォローを一覧で表示する機能」でした。
このような背景から、導入前はフォロー・フォロワー情報の保存に関して以下の優先度で実装していました。
- フォローのアカウント情報を優先して保存
- フォロワーについてはSocialDogに未保存のアカウント情報のみを優先して保存
つまり、SocialDogに保存済みのフォロワー情報に関しては、データを取得してもデータ更新を行わない状態でした。
課題
フォロー・フォロワーのアカウント管理機能において、以下の課題がありました。
- フォロワーデータの更新不備
- Cloud SQLでデッドロック(排他制御の競合状態)が頻発
- 連携されたXアカウントのフォロー・フォロワー情報を全件保存すると1日の更新件数が2億行に達する
- 保存先のテーブルが巨大
- 外部APIの利用制限
- 外部APIの利用制限により、フォロー・フォロワーデータの保存に失敗しても再試行ができない
解決策の検討
フォロワーのデータを更新する方法について検討しました。
- フォローデータと同様の更新方式
- フォローデータと同じように外部APIからデータ取得時に保存
- しかし、単純にUPDATE文を実行しただけだとデッドロックが頻発
- トランザクションの分離レベル調整、一括更新(Bulk UPDATE)などSQLの変更で解決できないか検討したが、保守性や影響範囲の観点から断念
- フォロワーデータ保存をマイクロサービス化
- フォロワーデータ保存専用のマイクロサービスを実装
- 利用するクラウドサービスとして以下を比較検討しました
- Cloud Pub/Sub
- Cloud Tasks
採用したソリューション
変更前
変更後
フォロワーデータ保存は最大100ユーザー分のデータ取得が並列実行されています。
Cloud Pub/Subの場合、最大100ユーザー分の更新処理が同時にCloud SQLにアクセスしてしまいます。
そのため、Cloud RunでそのままCloud SQLに保存するのとほぼ同じになってしまい、デッドロックが起きてしまう懸念がありました。
それに対してCloud Tasksは配信先の同時実行数を制御することができるため、デッドロックが起きない程度の並列数に調整することができます。
また、デッドロックが起きてしまっても、Cloud Tasksが自動的にリトライしてくれるので、保存失敗のリスクに対応することができます。
これらの理由からCloud Tasksを使用したマイクロサービス化する方針で実装を行いました。
なお、Cloud Tasksはタスク実行順序を保証しないため、データ取得完了時点でアカウント情報が古い可能性があります。
しかし、1日以内にはデータが更新されるためアクティブ判定には問題ないと判断しました。
導入効果
導入後はフォロワーデータの全量保存が1日以内で完了し、アクティブ判定も正常に動作させることができるようになりました。
SocialDogで扱うプロフィール情報も最新のものとなり、1日2億行のフォロー・フォロワーのデータ更新も行うことができました。
毎日更新されるプロフィール情報を利用して、他のXアカウントをベンチマークする新機能もリリースすることができました。
今後の展望や取り組み予定について
SocialDogでは現在、Compute Engine上で動くPHPを使った処理からCloud Runへの移行を進めています。 バッチ処理についてもcronを利用したスケジューラー管理から、順次Cloud Run + Cloud Schedulerに移行していきたいと考えています。
Cloud Run + Cloud Schedulerに移行することで、スケジュール間隔の調整が容易になることや、デプロイ、サーバー管理の手間が省けるなど運用面でメリットがあります。
Cloud Pub/SubやCloud Tasksに関しては似たようなサービスではありますが、ユースケースが異なります。 Google Cloudのドキュメントも参考に、適したユースケースに応じて利用するサービスを検討するスキルを向上させていきたいと考えています。
◆執筆:株式会社SocialDog Analyticsチーム 中村友耶
テックブログはこちら
アーキテクチャを構成するツール
会社情報

株式会社SocialDog
従業員規模 11名〜50名
私達は、「あらゆる人がSNSを活用できる世界を創る」というミッションを掲げ、国内アカウント数シェアNo.1のSNSアカウントマネジメントプラットフォームSaaS「SocialDog」を開発・運営するスタートアップ企業です。 SNS運用にまつわるさまざまな課題を解決できるSaaSとして「SocialDog」の企画・開発をしています。 創業から8年、日本国内でSNSツールとしてユーザー数シェアNo.1となった今、「対応SNSの拡大」をしつつ、「海外展開」を目指しています。