BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Twitterのリアルタイム通知アーキテクチャ

Twitterのリアルタイム通知アーキテクチャ

ブックマーク

原文(投稿日:2017/06/20)へのリンク

TwitterのエンジニアリングマネージャであるSaurabh Pathak氏がQCon London 2017で、自社サイトの通知アーキテクチャについて講演した。取り上げられた話題は、Twitter特有の重要な課題であるソーシャルネットワークのバイモーダル性、スパイクの処理、リアルタイムで通知を提供する必要性などだ。

一般的なソーシャルネットワークとは違い、witterは非対称である、とPathak氏は説明する。100万を越えるフォロワを抱えるユーザもいれば、100に満たないユーザもいるのだ。これにより、通知は性質的にバイモーダルとなると同時に、リアルタイムで処理することが難しくなる。例えば、人気のある有名人のツィートは、一般ユーザよりもはるかに大きな負荷を発生させる。

このようなユーザタイプの違いとパフォーマンス要件の厳しさが相まって、次のような難しい課題を生じさせている、とPathak氏は説明する。

  • レイテンシ: 可能な限り早く通知を受け取れなくてはならない。Twitterの目的は、何が起きているのかをリアルタイムで知ることにあるからだ。
  • ファンアウト: 数百万のフォロワを持つユーザによるひとつのツイートは、何百万という通知を引き起こす可能性がある。システムはこのような大きなスパイクに対処できなければならない。
  • 不均一な(hererogeneous)コール: キャッシュ呼び出しなど一部の内部コールは数ミリ秒で完了するが、Googleなど外部サービスの呼び出しには0.5秒以上かかる場合がある。スケーリングにおいては、これらのタイプのコールがどのように組み合わされるのかを考慮しなければならない。
  • マルチデータセンタ: Twitterは可能な限り復元性が高く、フェールオーバ時にも通知を受け取れなければならない。

これらの課題に取り組む前提として、まず、通知はプッシュベースのモデルとプルベースのモデルとに分類される。Twitterのフィードにアクセスした時に表示される通知タイムラインはプル型であり、SMSとEメールはプッシュ型である。

プルベースのモデルではタイムラインの生成が高価な操作になるため、一般的に通知はキャッシュから提供される、とPathak氏は説明する。このためTwitterでは、RedisからTwitterがフォークした、リアルタイム分散バッキングストアのManhattenを利用している。キャッシュを使用によってレイテンシが最小限に抑えられ、良好なユーザエクスペリエンスを提供することができる。さらに、フェールオーバ発生時にも同じ内容の通知タイムラインを表示できるように、データセンタ間で非同期的なレプリケーションが行われている。

Pathak氏の説明によると、プッシュ通知の場合、レイテンシとスパイクに対処するために、水平スケーリングとともに短時間有効なキャッシュを活用している。この方法は、同一ユーザに対して数百万のイベントが発生した場合に有効だ。

コールの不均一性に対処するため、Twitterでは優先度付きキューを使用して、重要なコールがブロックされるのを防いでいる。有名人のツイートが誰かのログインコールによってブロックされることはない。さらにコールはプロファイルされ、種類別にグループ化されている。これにより、外部依存関係がダウンした場合でも、障害を分離することが可能になる。

Pathak氏は最後に、アーキテクチャの長所を次のように結論付けている。

  • 可能な限り多くの部分で非同期オペレーションを活用している。同期オペレーションよりもスケールアップが容易だからだ。
  • 読み取り時間と書き込み時間のトレードオフを行なう場合、IDのように、失効することのなさそうな書き込み専用データについて考慮する。
  • アプリケーションが複数のデータセンタをサポート可能かを、一から確認する。

この講演と、続けて行われたGary Lam氏(Twitterのスタッフエンジニア)による通知のパーソナライズに関する講演は、すべてオンラインで見ることができる。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT