Сокеты для обновления страницы

Саня

Новичок
Сокеты для обновления страницы

Здравствуйте!

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

Есть сайт, информация на котором обновляется ежесекундно. У клиентов она должна обновляться сразу. Сейчас это реализовано аяксом. То есть, каждую секунду каждый клиент делает по новому аяксовому запросу. По идее, это не очень эффективно, так как на каждый запрос открывается новое соединение с сервером. Возникла идея переделать механизм запрашивания данных на сокеты, дабы каждый клиент открывал одно соединение и использовал его всё время, пока он сидит на странице.

На сервере пока всё работает на Апаче + ПХП.
Потенциальное количество одновременных посетителей: 10 000 человек.

Для начала возникли такие вопросы:

1. Можно ли использовать Апач или гораздо лучше поставить ещё один сервер (например, lighthttpd) на другом порту?
Какие настройки в таком случае надо менять (ServerLimit, MaxClients,..)? Какие, по вашему опыту, значения допустимы?

2. Имеет ли смысл думать о написании своего "сервера", который просто будет слушать порт и ловить клиентов?

3. На клиенте для реализации сокетов планируется использовать Флеш. Есть ли альтернативы, кроме Явы и ВебСокетов?

4 . Какие ещё аспекты вы считаете нужным отметить?
 

AmdY

Пью пиво
Команда форума
информация для всех разная, или одна и та же?
 

Саня

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

440hz

php.ru
для nginx есть модуль поддерживающий постоянное соединение и каналы. можно через него пулять.
 

mity

Новичок
Можно обойтись стандартным JavaScript

На станице создаётся скрытый фрейм, со страницей содержащей команды, добавляемые каждую секунду
PHP:
<script>updata(1.0);  </script>

<script>updata(1.1);  </script>

<script>updata(1.0);  </script>
После 1000 команд перезагружаем страницу во фрейме.
Соответственно имеем одно TCP соединение на клиента, перезапускаемое каждые 1000 сек.

Один из побочных эффект заключается в том, что браузер всё время в "строке статуса" будет отображать что станица грузится.

http://javascript.ru/ajax/comet

Но возникает ещё одна проблема получится ли запустить столько дочерних потоков/процессов PHP, (аякс и фрейм может быть загружен только с того же адрес:порт).

На флеше конечно лучше. Можно грузить с произвольных адресов:портов. И в случае увеличении нагрузки её проще сбалансировать. Можно не использовать громозкий php. А написать простейший многопоточный сервер сидящий на отдельном адресе:порте.

А вариант с Frame:JavaScript оставить как резервный для тех у кого отключён Flash.
 

Саня

Новичок
Спасибо за инфу. realplexor наверно не совсем подходит, так как после каждой отсылки информации открытое соединение закрывается.

Ифрейм кажется более подходящим, но это - костыль и подпорка. И надо ещё посмотреть, как там с другими побочными эффектами.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>Можно грузить с произвольных адресов:портов.
и потерять всех, кто идет через прокси только на 80/443
лучше на отдельном ip на 80м
 

Саня

Новичок
Автор оригинала: grigori
>Можно грузить с произвольных адресов:портов.
и потерять всех, кто идет через прокси только на 80/443
лучше на отдельном ip на 80м
Точно, спасибо за коментарий.
 

MiksIr

miksir@home:~$
У кустарного стриминга есть проблемы застревания данных в кешах всяких фаирволов и антивирусов. Так что запрос/ответ более предсказуем. Утверждать не берусь, но мне кажется, что все запросы поползут через одно keep-alive соединение, так на установку соединения расходов не должно быть. На другом конце nginx который сам будет все брать из мемкеш и подставлять в шаблон - и все счастливы. Если апач убрать за nginx - то и отдельный ip не нужен. А там, глядишь, и вообще от апача откажетесь в пользу fastcgi
 

Саня

Новичок
Хорошо.

Следущий вопрос. На том же Дклабе есть статья, почему ФастЦГИ под Апачем не лучше, чем МодПХП.
Дополнительно, когда-то у одного клиента была проблема, что когда количество клиентов превысило количество процессов в ФастЦГИ, всё упало. Тогда хостер огрёб мотивационных мер и со временем всё стало лучше. Но осадок остался.

В случае Нгникса можно использовать только ФастЦГИ. Насколько можно под ним увеличивать количество ЦГИ процессов? И есть ли какие-то подводные камни, о которых можно прямо сразу сказать?
 

MiksIr

miksir@home:~$
> В случае Нгникса можно использовать только ФастЦГИ.
Нет, можно проксировать на апач

> когда количество клиентов превысило количество процессов в ФастЦГИ, всё упало
Когда количество клиентов превышает максимальное количество клиентов апача - все тоже падает.

> На том же Дклабе есть статья, почему ФастЦГИ под Апачем не лучше, чем МодПХП.
В общем апач выкидывают просто как ненужное звено. Это позволяет чуточку освободить память сервера. Серьезно производительности не добавляет - это факт, так что если есть еще какие-то апачезависимые вещи, можно оставить апач+mod_php
 

Саня

Новичок
> Нет, можно проксировать на апач
Если ежесекундно запрашивается ПХП скрипт, при этом никакой статики не запрашивается, даст ли этот подход экономию ресурсов?
 

MiksIr

miksir@home:~$
> Если ежесекундно запрашивается ПХП скрипт, при этом никакой статики не запрашивается, даст ли этот подход экономию ресурсов?
Как правило нет. Может дать если ответы большие и клиенты относительно медленные - тогда nginx будет быстро забирать ответ с PHP освобождая его и на скорости клиента отдавать его.

Но речь была не об этом. Nginx умеет тем или иным образом работать напрямую с memcached. Вполне можно (и нужно) реализовать схему, что бы ваши частые запросы полностью обслуживались nginx-ом, не доходя до PHP. Если опишите задачу более подробно - можно будет говорить уже о конкретных решениях.
 

Саня

Новичок
О, это интересно. Технически сейчас всё выглядит так:
1. Кроном ежесекундно генерируется шаблон с данными для всех пользователей, который содержит строковые метки.
2. Другие скрипты, занятые обработкой данных и событий делают в memcached записи для отдельных клиентов (ключ содержит ИД клиента, данные - массив).
3. Клиент запрашивает файл ajax.php?clientId=N
4. ajax.php по ИД клиента находит его запись в memcached, берёт массив, заменяет метки на данные.

Чтобы один клиент не мог смотреть данные другого (данные не критичные, но всё же), clientId содержит также контрольную сумму. Но это уже детали.
 

MiksIr

miksir@home:~$
Вариантов много. Самый банальный, "в лоб", это http://sysoev.ru/nginx/docs/http/ngx_http_ssi_module.html + http://sysoev.ru/nginx/docs/http/ngx_http_memcached_module.html
Ну и рыть рассылку и гугл, ибо много вкусностей ходят отдельными модулями/патчами. Мона еще тут посмотреть wiki.nginx.org
В частности про постоянные соединения с мемкешом был модуль
 

Активист

Активист
Команда форума
На гаген смахивает. А почему бы демон не написать? Правда не на PHP))
 

AmdY

Пью пиво
Команда форума
Активист
для гагенов вполне хватает php-шного демона, проверено.
 
Сверху