Как оповестить пользователей о другом, который сейчас онлайн?

Я использую Yahoo Messenger, чтобы общаться с моими друзьями. Каждый раз, когда мой друг заходит в онлайн (почти промежуточно), YM уведомляет меня. Как появился Yahoo! (и другие компании) сделать, чтобы реализовать это? Насколько я думаю, есть несколько методов, чтобы решить эту проблему:

  • Вытягивание: клиент постоянно (возможно, длительностью 500 мс) запрашивает сервер о том, какие пользователи (в списке пользователей) только что подключились к сети, а затем уведомляет пользователя.

  • Нажатие: сервер определяет, какие пользователи приходят в сеть, а затем отправляют уведомление клиенту.

Второй подход гораздо более приемлем. Данные пользователя могут содержать список его друзей (которые добавили его в свои списки), и при возникновении события входа в систему серверное приложение отправит уведомление всем пользователям в этом списке.

ОК, это только мое предположение. Как это было реализовано в реальности? Можешь сказать мне?

Спасибо.

8 ответов

Сервер проталкивает данные вниз. на сервере есть список ваших друзей и, что более важно, список тех, чей список вы находитесь. когда вы входите в систему, он просматривает этот второй список и отправляет сообщение каждому подключенному клиенту. это довольно просто на самом деле. взгляните на исходный код Pidgin ( http://pidgin.im/) для более подробной информации о реализации.

Я предлагаю использовать Wireshark или любого другого инспектора сетевого трафика, чтобы точно знать, что происходит с Yahoo Messenger во время его работы.

Должна быть "архитектура пуша".

Серверы не могут терпеть постоянное вытягивание для большого количества пользователей.

Я знаю, gtalk над Gmail и Facebook использует кометы. это похоже на хорошую технику, но это дорого. это хороший учебник по PHP

Когда вы входите в систему, Yahoo отправляет (отправляет) "онлайн-событие" всем в вашем списке, кто также онлайн. Если соединение по HTTP, между вами и сервером Yahoo существует обмен пинг-понгом, чтобы поддерживать соединение ( википедия), что позволяет этому проталкивать через NAT и все такое. Иначе, соединение TCP/IP сохраняется во время вашего входа в систему. Если пинг / понг не был успешным (после нескольких попыток, как вы могли бы предположить), сервер Yahoo отправляет (толкает) сообщения всем своим онлайн-друзьям, уведомляя их об "офлайн-событии".

Таким образом, чтобы ответить на ваш вопрос, это толчок.

Я согласен с другими в том, что вы можете просто изучить исходный код или сетевые пакеты самостоятельно, но подумайте об этом с другой точки зрения: какой подход имеет больше смысла, когда у вас есть сотни тысяч пользователей, а большинство пользователей, вероятно, имеют всего несколько десятков "приятелей"?

  1. Сотни тысяч пользователей пингуют ваши серверы каждые несколько секунд = большая нагрузка
  2. Выпускайте обновления для клиентов, когда статусы их друзей изменяются, что, вероятно, происходит в гораздо меньшем масштабе - несколько обновлений каждые несколько минут.

Возможно долгоживущие HTTP-запросы. Клиент IM вызывает метод HTTP на сервере, но сервер не отвечает, пока не произойдет обновление. В этот момент он отвечает "update", и IM-клиент затем вызывает другой HTTP-метод для получения обновления.

Реальный толчок невозможен, потому что многие (большинство?) Люди в Интернете отстают от NAT-маршрутизаторов.

Он использует технологию, аналогичную Buddy Check, но только позволяет узнать, хочет ли пользователь, чтобы вы знали. Но Buddy Check на самом деле дает вам настоящую правду.

Другие вопросы по тегам