こんにちは、 @koni です。
whotwiが、本日のアップデートにより、全体的にさくさくになりました! 特に数万人規模のフォロワーがいる方の動作が大幅に改善されました。また、記念日お知らせツイートについても、改善しました。
変更点
変更点は以下になります。
- 2回目以降のページ表示が高速になりました(Twitterにシェアした際に一瞬で表示されます)
- フォロー・フォロワーが多い方の「Rate Limit」エラーが大幅に軽減され、動作も高速になりました
- 記念日お知らせツイートが届かない方を減らしました。
やったこと
①インフラ環境の移行
whotwiは10月にAWSに移行しましたが、思ったよりも転送量がかさんでいたため、転送量が一切かからない「さくらのクラウド」に再び移行しました。
また、これまでApache + mod_php で動いていたサーバー環境を、nginx + PHP-FPM に移行しました。 さらにfastcgi-cacheの設定をチューニングし、キャッシュを積極的に使う設定にしました。
特にfastcgi cacheの威力が凄まじく、トップページのレスポンスが10-20msまで短縮されました。 すげー早い。
fastcgi cacheは、返却するHTMLそのものをファイルとして保存しておくタイプのキャッシュなので、ユーザーごとに内容が変わらないページの返却がめちゃくちゃ早いです。そしてキャッシュヒットした場合はそもそもPHPが動かないのでサーバーに優しいのです。
ログインが必要なページはキャッシュできないので、ログイン中はキャッシュしないようになっています。
nginxをちゃんと使うのは初めてだったのですが、数行の設定でここまでの威力を発揮できるなんてすごいですね、nginx。 設定ファイルもわかりやすいし。
②フォロー・フォロワー・両思い・片想い処理の効率化
フォローが数万件を超えてくるとエラーが頻発する状態にありましたが、大幅に改善しました。フォロー・フォロワーの多い方は、ぜひお試しください。
エラーになっていたのは、APIの/friends/ids
です。このAPI、15分あたり15回しか叩けず、一度に5000ユーザー分しか取得できないので、例えば50000人フォロワーがいるアカウントでは全部で10回叩く必要があります。また75000人以上フォロワーがいるアカウントの場合は、15回以上必要なので、一度には取りきれません!
そこで、片想い・両思いを表示する際に一番時間のかかっていたユーザーのフォロー・フォロワーを全員取得する処理を、一度取得して以降は、whotwiのサーバー側で処理するようにしました。
このあたりは、Twitter APIを叩く各サイトとも、いろいろな工夫をしている箇所かと思います。こういうベスト・プラクティスみたいなのがどこからにまとめていたら嬉しいんだけどなー。
③「お祝い通知」が届くようになりました
whotwiにログインすると、Twitterをはじめた記念日の際に以下のような感じで @whotwi アカウントからお祝いのメンションをする機能があります。
@koni おめでとうございます!!edostudyさんは、2007/4/10にTwitterを始めたので、今日でTwitter8周年です!詳しい分析はこちら→https://t.co/y4IZA9YYnm
— whotwi グラフィカルツイッター分析 (@whotwi) January 14, 2016
これが正しく機能していなかったので、正しく動くように修正しました。 ちなみに現在whotwiのログインユーザーは80万人くらいなので、一日2000名の方まで通知を送ることになりそうです。
開発中、フォロワーが数名しかいないアカウントでテストしていたら、以下のようなエラーメッセージで一時的にツイートできなくなってしまいました。
This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later.
ヘルプセンターによると、Twitter側の制限で1日2400ツイートまで、さらに30分ごとの制限に分かれている、とのことです。 さきほど試したときは3時間ほどで使えるようになりました。
ツイート: 1日に2,400件。1日のツイート投稿リミットは、さらに30分間隔の細かいリミットに分かれます。リツイートもツイートとしてカウントされます。 リミットに達した場合の対応 リミットに達した場合、リミットに達したことを示すエラーメッセージで通知します。時間ベースのリミット (ダイレクトメッセージ、ツイート、アカウントの登録メールアドレスの変更、APIリクエストリミット) に関しては、リミット時間終了後に再度お試しください。 1日に2,400件のツイート投稿リミットは、さらに30分間隔のリミットに分かれます。アカウント更新/ツイートリミットに達した場合は、リミット期間終了後となる2~3時間後に、もう一度お試しください。
Twitterリミット (API、ツイート投稿、およびフォロー) | Twitterヘルプセンター
そこで、1時間おきに少しずつツイートするようにプログラムを修正したところ、問題なく動いているようです。
今後について
whotwiは、月間300万PV、70万UUほどあり、多くの皆様にご利用いただいているので、今後も改善を続けていくつもりです。
よろしくお願いします。