はじめまして。ユニークビジョン 取締役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でも発信しています。
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という構成に切り替えました。その結果、予想以上の高負荷にも耐えられるキャンペーンシステムを構築でき、大量アクセスに対しても安定したパフォーマンスを提供することが可能となりました。
ユニークビジョンは、XとLINE向けのキャンペーンシステムに加え、複数の自社サービスにRustを採用しています。アカウント管理サービス「Belugaスタジオ」やキャンペーンで収集した顧客情報を管理する「Beluga CRM」の一部をRustで開発しているほか、InstagramやTikTokといったほかのSNS向けキャンペーンでも全面採用しています。
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]
-
本記事は、2025年4月17日に開催されたイベントの内容を元に編集した記事です ↩