サーバー完全停止で始まったRust導入の軌跡 課題に向き合うことは忘れない

投稿日時:
青柳 康平のアイコン

ユニークビジョン株式会社 / 取締役CTO

青柳 康平

Xアカウントリンク

はじめまして。ユニークビジョン 取締役CTOの青柳です。今回は「課題を解決し、Rustとその界隈を良くしていく」という視点から、当社が展開するSNSキャンペーンや技術的アプローチについてお話しします。

ユニークビジョンは、SNSマーケティングの領域で事業を展開しており、SNSを活用したキャンペーンの運営や、SNSアカウントの分析・運用を支援するサービスを提供しています。2025年4月時点で社員は約70人、そのうち約半数の33人がエンジニアです。エンジニアは、主に自社ツールの開発やキャンペーン案件の管理を行っています。

キャンペーンの案件管理では、ユーザーがXやLINEでアカウントをフォローしてリプライ/リポストしたり、商品購入時のレシートをアップロードしたりすることで、商品が抽選で当たるといったキャンペーンの運営を支援しています。

大量のCSVダウンロードで直面した、サーバー完全停止

Rustの導入経緯についてお話しします。ユニークビジョンではもともと、Ruby on Railsでシステムを開発していました。しかし、X(当時Twitter)のキャンペーンシステムの運用時に約14万件のCSVダウンロードを処理していたところ、当時のサーバースペックが低かったこともあり、サーバーが完全に停止してしまいました。

当時趣味で触れていたRustを試したところ、わずか6分ほどでCSVの生成が完了するという、実用レベルの結果が得られました。大量のデータを扱うのに適していることが、導入の決め手でした。当社は2016年とかなり早い時期にRustを業務に採用し、当時の取り組みはQiitaでも発信しています。

RustでRailsの代わりにCSVを作る

LINEキャンペーンは全面Rust化、複数サービスに広がる

Xに続き、LINEのキャンペーンシステムの提供も開始。LINEでは、お客さまのアカウントの「友だち」数が多い傾向にあるため、Xの3倍ほどの負荷を想定しました。当時のRuby on Rails(Ruby 3.0以前)では厳しいのではないかと判断し、LINEではRustを全面的に採用することにしました。

X側はRuby on RailsとPostgreSQLという構成で運用していましたが、LINE側はRust(当時はActix Web)とRedisという構成に切り替えました。その結果、予想以上の高負荷にも耐えられるキャンペーンシステムを構築でき、大量アクセスに対しても安定したパフォーマンスを提供することが可能となりました。

Rust導入経緯.jpg

ユニークビジョンは、XとLINE向けのキャンペーンシステムに加え、複数の自社サービスにRustを採用しています。アカウント管理サービス「Belugaスタジオ」やキャンペーンで収集した顧客情報を管理する「Beluga CRM」の一部をRustで開発しているほか、InstagramやTikTokといったほかのSNS向けキャンペーンでも全面採用しています。

Rustのプロダクト.jpg

3種の機能で光るRustの強み

ユニークビジョンのSNSキャンペーンシステムでは、主にSNS上の投稿を回収する「クローラー」、抽選を行う「抽選処理」、抽選結果を伝える「配信処理」の機能を開発・運用しています。どの処理も非同期で制御する必要がある中、Rustで書くことでバグの低減と高いパフォーマンスを実現しています。

クローラーでは、主にWebhookとREST APIという2つの方式を組み合わせ、リアルタイムかつ確実に投稿を回収しています。いずれの処理も非同期で行うため、Rustが活躍しています。

抽選処理では、回収された投稿がキャンペーン対象かをフィルタリングした上で、当選/落選を決定する後続処理に送ります。当選の在庫は少ないため競合状態になりやすいですが、Rustの非同期処理によって競合を制御し、正確な在庫管理を実現しています。

配信処理では、ダイレクトメッセージやリプライ、コメントなど、さまざまな方法で結果を返しますが、レートリミットなどの制約がある中、非同期で配信しています。

課題には都度向き合う、動的カスタマイズにも対応

さまざまな課題は、都度改善を図っています。例えば、データベースのカラム変更があるとテストが壊れるという課題に対しては、builderパターンを取り入れるなど、継続的にテスト環境を強化してきました。また、外部APIを呼び出す処理はテストが難しいため、APIのラッパーを作成してモック化を可能にし、各プロジェクトで活用しています。

同じような処理を何度も書くのを避けるため、共通ライブラリも整備しています。例えば、帳票を出力する際にはCSVとZIPを組み合わせて作業する部分が多く、各プロジェクトで重複実装が発生していました。そこで、CSV生成とZIP圧縮を簡潔に行えるライブラリを開発し、社内外で利用を進めています。常駐プログラム(デーモン)を構築しやすくするライブラリなども作り、開発効率を上げています。

Rustには、動的なカスタマイズが苦手という課題があります。キャンペーンでは「お客さまごとにカスタマイズしたい」というニーズが高いため、当社ではRustの代わりにLuaを組み込み、必要な時にRustからコールする形で対応しています。

しかし、エンジニアからは「LuaはRustと比べて使いにくい。全部Rustで書きたい」という声も上がっており、Rustで主要なロジックを記述し、動的なカスタマイズが必要な部分は、Rustから呼び出し可能なWebAssembly(Wasm)で実装することを検討しています。WasmのランタイムをRustアプリケーションに組み込むことで、この連携を実現できると考えています。

Rustの普及に向けて、改善内容をライブラリや資料として公開したり、LT会を開催したりしています。当社は毎月LT会「UV Study」を開催しており、RustやVue.jsなどの話題を取り上げています。現在、エンジニアとディレクターを募集しており、エンジニアはRustの経験がなくても問題ありません。ご興味があればぜひご応募ください。[1]

Loading...Loading...Loading...
脚注
  1. 本記事は、2025年4月17日に開催されたイベントの内容を元に編集した記事です

プロフィール