読者です 読者をやめる 読者になる 読者になる

koni blog

東京のウェブエンジニア koni です!ウェブサービスをガシガシ作っていきます!

whotwi 分析機能強化のお知らせ(ツイート全保存&Aurora移行)

whotwi

こんにちは、Twitter分析サイト whotwi ですが、3月17日頃から、ツイートをブログ形式で見られる機能を導入しました。

新機能の紹介と技術的な変更ポイントをお伝えします。

新機能

  • ログインしたユーザーのツイートをwhotwiサーバーに保存
  • 分析がパワーアップ
    • 高速に
    • 分析件数を増やせる
  • 過去のツイートが探しやすくなりました
    • 年月ごと
    • カレンダーから探す
    • キーワード検索
    • ハッシュタグごと
    • やりとりごと

ねらい

  • 分析速度向上によるユーザー体験の改善
  • ユーザーのツイートによるSEO効果
  • ツイ廃の方の分析結果が直近のものに偏りすぎてしまう問題の解消
  • 分析件数変更のためログイン数の向上

分析の高速化のために

これまでのwhotwiの分析機能では、アクセスの都度直近600件のツイートを取得、分析して表示していました。

ツイートの取得はTwitterのAPI経由で200件ごとに取れるので、3回リクエストする必要があります。

ツイートの取得で使う statuses/user_timeline というAPIでは、page/limitのようなページングではなく、max_id/since_idで取得する方式(前のリクエストで帰ってくるidを次のリクエストで使う必要がある)なので、並列化して高速化することはできません。

APIを3回叩くのにどうしても時間がかかってしまうので、体感少し早く感じるようにするために、ページをまず返却し、AjaxでAPIを叩き、データを取得するようにしていました。

ただ、これでもやはりAPIをシリアルに叩く部分の時間はどうしてもかかってしまっていました。

また、結果はキャッシュするので、しばらくの間は時間がかからず表示できるのですが、結局そのキャッシュが切れるとまた1から取得し直す必要があります。

そこで、今回、ツイートをDBに保存するようにし、差分のみTwitterから取得するように変更しました。 多くのユーザーはデイリーのツイート数が数十に収まるので、数日に一回このAPIを叩けば分析対象を減らさずに、処理時間を短縮できます。

ツイート保存の工夫

分析には1ユーザーあたり600件のツイートが必要です。 whotwiでは1日に数万ユーザーの分析が行われるので、それだけで数百万件のツイートを保存する必要があります。

したがって、大量のツイートの保存に耐えられる構成にする必要があります。

トラブルを減らすために慎重にDBのスキーマ設計を行いました。

このため、久しぶりに「ハイパフォーマンスMySQL第三版」を読みました。 この本は、体系的に書かれているので、大変勉強になりました。 若干古く、MySQL 5.6の情報がほとんど入っていないのが残念ですが・・・ あとオライリー本なので眠くはなります(笑)

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

RDS Auroraへの移行

ずっと増えていくツイートが増えるたびにディスクスペースの心配する嫌なので運用をできるだけ楽にしたい、「新しいもの使ってみたい」ということで、RDSのAuroraに移行しました。 RDSのAuroraはディスクスペースが自動的に拡張し、適切な設計であれば、MySQL on RDS とくらべて最大5倍!の性能があるとされています。

AuroraはMySQL 5.6互換とされていて、移行前はMySQL5.6を使用していたので、本当にソースコードの修正なくさくっと移行できました。ツイート1億件、数十GBくらいまできましたが、今のところ特に問題はありません。

サイズがr3.largeからしかないので、本当にスモールスタートという時は使えないですが、スケールアップした途中でAuroraに乗り換えるのは全然ありですね。

料金については、思ったよりも時間料金より、I/Oコストがかさみます。

一箇所インデックス使えずフルスキャンになっている箇所があり、I/Oのコストがやばいことになっていましたが、修正したら半分になりました。AWSのデイリーコストを見る習慣がなかったらと思うとぞっとします。 気をつけましょう。

今後も機能改修を行っていきます。

引き続き、よろしくお願いします!