Как оповестить пользователей о другом, который сейчас онлайн?
Я использую Yahoo Messenger, чтобы общаться с моими друзьями. Каждый раз, когда мой друг заходит в онлайн (почти промежуточно), YM уведомляет меня. Как появился Yahoo! (и другие компании) сделать, чтобы реализовать это? Насколько я думаю, есть несколько методов, чтобы решить эту проблему:
Вытягивание: клиент постоянно (возможно, длительностью 500 мс) запрашивает сервер о том, какие пользователи (в списке пользователей) только что подключились к сети, а затем уведомляет пользователя.
Нажатие: сервер определяет, какие пользователи приходят в сеть, а затем отправляют уведомление клиенту.
Второй подход гораздо более приемлем. Данные пользователя могут содержать список его друзей (которые добавили его в свои списки), и при возникновении события входа в систему серверное приложение отправит уведомление всем пользователям в этом списке.
ОК, это только мое предположение. Как это было реализовано в реальности? Можешь сказать мне?
Спасибо.
8 ответов
Сервер проталкивает данные вниз. на сервере есть список ваших друзей и, что более важно, список тех, чей список вы находитесь. когда вы входите в систему, он просматривает этот второй список и отправляет сообщение каждому подключенному клиенту. это довольно просто на самом деле. взгляните на исходный код Pidgin ( http://pidgin.im/) для более подробной информации о реализации.
Я предлагаю использовать Wireshark или любого другого инспектора сетевого трафика, чтобы точно знать, что происходит с Yahoo Messenger во время его работы.
Должна быть "архитектура пуша".
Серверы не могут терпеть постоянное вытягивание для большого количества пользователей.
Я знаю, gtalk над Gmail и Facebook использует кометы. это похоже на хорошую технику, но это дорого. это хороший учебник по PHP
Когда вы входите в систему, Yahoo отправляет (отправляет) "онлайн-событие" всем в вашем списке, кто также онлайн. Если соединение по HTTP, между вами и сервером Yahoo существует обмен пинг-понгом, чтобы поддерживать соединение ( википедия), что позволяет этому проталкивать через NAT и все такое. Иначе, соединение TCP/IP сохраняется во время вашего входа в систему. Если пинг / понг не был успешным (после нескольких попыток, как вы могли бы предположить), сервер Yahoo отправляет (толкает) сообщения всем своим онлайн-друзьям, уведомляя их об "офлайн-событии".
Таким образом, чтобы ответить на ваш вопрос, это толчок.
Я согласен с другими в том, что вы можете просто изучить исходный код или сетевые пакеты самостоятельно, но подумайте об этом с другой точки зрения: какой подход имеет больше смысла, когда у вас есть сотни тысяч пользователей, а большинство пользователей, вероятно, имеют всего несколько десятков "приятелей"?
- Сотни тысяч пользователей пингуют ваши серверы каждые несколько секунд = большая нагрузка
- Выпускайте обновления для клиентов, когда статусы их друзей изменяются, что, вероятно, происходит в гораздо меньшем масштабе - несколько обновлений каждые несколько минут.
Возможно долгоживущие HTTP-запросы. Клиент IM вызывает метод HTTP на сервере, но сервер не отвечает, пока не произойдет обновление. В этот момент он отвечает "update", и IM-клиент затем вызывает другой HTTP-метод для получения обновления.
Реальный толчок невозможен, потому что многие (большинство?) Люди в Интернете отстают от NAT-маршрутизаторов.
Он использует технологию, аналогичную Buddy Check, но только позволяет узнать, хочет ли пользователь, чтобы вы знали. Но Buddy Check на самом деле дает вам настоящую правду.