2009-05-07 3 views
1

私は友人とチャットするためにyahooメッセンジャーを使用しています。私の友人がオンラインになるたびに(ほぼ中間に)YMが私に通知します。どうやってYahoo! (そして他の企業)がこれを実装するのですか?私の知る限りを推測として、この問題を解決するためにいくつかのテクニックがあります。他のユーザーに通知する方法は現在オンラインですか?

  • を引っ張る:クライアントは常に(多分500msの期間を、)(ユーザーのリストで)ユーザーは、単にオンラインになったかについてサーバーに尋ねると、ユーザーに通知します。

  • プッシュ:サーバーは、どのユーザーがオンラインになったかを判断し、クライアントに通知を送信します。

第2のアプローチははるかに受け入れられます。ユーザーのデータに友人のリスト(リストに追加したユーザー)が含まれていて、ログインイベントが発生すると、サーバーアプリケーションはこのリストのすべてのユーザーに通知メッセージを送信します。

これは私の推測です。現実にどのように実装されましたか?教えて頂けますか?

ありがとうございます。

+0

YMがあなたに「ほぼ直ちに」通知することをどう知っていますか?それは、あなたに通知することを選択したときのあなたの認識です。 –

+0

私はログインしてから、すぐに私のルームメイトの友人のデスクトップの通知を参照してください! – Vimvq1987

答えて

0

HTTPリクエストが長く存続する可能性があります。 IMクライアントはサーバー上でHTTPメソッドを呼び出しますが、更新があるまでサーバーは応答しません。その時点で、それは「更新」で応答し、IMクライアントは別のHTTPメソッドを呼び出して更新を取得します。

インターネット上の多くの(ほとんどの)人がNATルータの背後にいるため、実際にプッシュすることはできません。

2

Yahoo Messengerが実行中に何が起こっているのかを知るために、Wiresharkまたはその他のネットワークトラフィックインスペクタを使用することをお勧めします。

0

これはBuddy Checkと同様の技術を使用していますが、ユーザーが知りたがっているかどうかだけを知ることができます。しかしバディチェックは実際にあなたに本当の真実を与えます。

0

ソースコードやネットワークパケットを自分で調べることはできますが、別の観点から考えてみてください。数十万人のユーザーがいて、ほとんどのユーザーがたぶん数ダースの "仲間"?

  1. は何百ものユーザーがサーバー数秒ごとに負荷の=ロット可能性がはるかに小さい規模で起こるクライアントへ
  2. プッシュアウト更新を自分の友人のステータスが変化し、pingを何千ものを持っている - いくつかの更新ごとに数分。
1

「プッシュアーキテクチャ」である必要があります。

サーバーは、多数のユーザーに対して一定の引き込みを許容できません。

3

サーバーがデータをプッシュしています。サーバーにはあなたの友人のリストがあります。さらに重要なのは、あなたのリストのリストです。サインオンすると、その2番目のリストを調べ、接続されている各クライアントにメッセージをプッシュします。本当にシンプルです。具体的な実装の詳細については、Pidginのソースコード(pidgin.im)を見てください。

0

あなたがログインすると、Yahooはオンラインのあなたのリストのすべての人に「オンラインイベント」を送信(プッシュ)します。接続がHTTP経由であれば、接続を維持するためにあなたとYahooのサーバとの間でping/pong交換が行われます(wikipedia)。これにより、このプッシュはNATやその他のものを介して行われます。それ以外の場合、TCP/IP接続はログイン中も有効です。 ping/pongが成功しなかった場合(再試行の回数が多いと仮定した場合)、Yahooサーバーはオンライン友人に「オフラインイベント」を通知するメッセージを送信します。

質問に答えるには、それはプッシュです。

0

私はgtalk over Gmailを知っていて、Facebookはcometを使用しています。これは良いテクニックのようですが、その高価です。これはPHPのgood tutotialについてです。

関連する問題