Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];

Вниз

Как оптимальнее организовать оповещения о событиях   Найти похожие ветки 

 
Дмитрий С ©   (2009-07-07 19:38) [0]

Проектируется продукт, который будет использоваться в моей организации. Продукт клиент-серверный, т. е. есть сервер и порядка 1000 подключенных клиентов. Два сегмента сети, примерно по 15% пользователей имеют достаточно медленное подключение (примерно по 2 мегабита на сегмент).
Для использования выбран протокол https, как наиболее оптимальный по ряду причин. В качестве сервера выбран Apache + PHP, так же по ряду причин.
Задача сервера, помимо обработки простых запросов, оповещать клиентов о чем либо. Собственно тут и встает вопрос, каким образом клиенты *своевременно* узнают об этих оповещениях. Есть два варианта, которые приходят на ум:
1. Это регулярные запросы на сервер.
2. Долгие запросы (фактически постоянное подключение).

Подробнее:
1. Регулярные запросы на сервер. К примеру, раз в 30 секунд (а это уже долго) выполняется запрос на сервер, для проверки - не случилось ли чего. В этом случае получаем нагрузку на сеть примерно 2000 запросов в минуту, а это примерно 33 в секунду - в итоге постоянная загрузка сервера.
2. Постоянное подключение. Т.е. клиент в отдельном потоке выполняет запрос на сервер, но сервер не отвечает до тех пор пока не появится какое либо событие. После обработки события, клиент снова создает подключения на сервер и ждет нового события.
Для контроля соединения сервер примерно раз в минуту посылает клиенту NOPE символ, к примеру пробел.
В итоге, получается нагрузка на сервер практически никакая (все потоки обслуживающие эти подключения почти всегда будут находиться в спячке, научить php делать waitforsingleobject + setevent не так сложно). Данный вариант мне более симпатичен, но тут возникает сложный вопрос по поводу того, как Apache будет вести себя при 1000 "висящих" подключений, да еще и под SSL. Для каждого, ведь, потребуется отдельный поток, а 1000 висящих потока держать не хочется.

Возникает еще такие варианты:
3. Оповещать клиентов о событиях широковещательными UDP пакетами. Клиент получает UDP пакет, по его содержимому определяет для него это событие или нет, и если оно для него - делает запрос на сервер. Минусы в том, что не будет возможности работать клиенту вне локальной сети, а также в том, что пакет будет не зашифрован.
4. Организация отдельного HTTP(TCP) сервиса. В данном случае для каждого клиента не создается отдельный поток. Лишь несколько потоков делают select подключенных сокетов, для того чтобы можно было мгновенно обнаружить разрыв соединения со стороны клиента. В принципе, данный сервис можно будет запускать в отдельном потоке процесса apache.

Ваше мнение по поводу данных вариантов? Как вы организовали бы оповещение клиентов в данном случае?


 
Хитрий Лис   (2009-07-07 19:46) [1]

Многа букав...

По тому что прочитал:
2 мегабита на сегмент - это очень быстро. На модеме при 128kb вполне приемлимая скорость.
1. Это регулярные запросы на сервер. - именно этот вариант у меня прекрасно работал, причем как с SQL-сервером, так даже и через почту. Постоянно "слушать" должен кто-то один, в данном варианте это сервер.


 
DVM ©   (2009-07-07 19:56) [2]


> Дмитрий С ©   (07.07.09 19:38)  


> Задача сервера, помимо обработки простых запросов, оповещать
> клиентов о чем либо.

Это как раз не задача сервера. Это задача клиента узнать об изменениях.

Я бы первый вариант выбрал. 33 запроса в секунду - это тьфу, а не загрузка.


 
Zeqfreed ©   (2009-07-07 20:03) [3]

Второй вариант. Только не понятно зачем Апач :)


 
DVM ©   (2009-07-07 20:08) [4]

Второй вариант имхо под IIS лучше.


 
Zeqfreed ©   (2009-07-07 20:17) [5]

Что за нравы. Чем Энджинкс не угодил?


 
tesseract ©   (2009-07-07 20:48) [6]

"По ряду причин" такая странная отмазка, особенно в виду того, что HTTP  для таких операций как-бы не подходит.   PHP так вообще не в тему. TomCat ещё куда ни шло. Но такую систему через IRC/SSL организовать всё проще будет.


> Что за нравы. Чем Энджинкс не угодил?


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


> Второй вариант имхо под IIS лучше.


Под IIS можно уже и Com+ без геммороя использовать.


 
Zeqfreed ©   (2009-07-07 20:53) [7]

> tesseract ©   (07.07.09 20:48) [6]

Для высоконагруженных проектов хорошо работает связка nginx + php-fpm. Ну и написать на C, например, FastCGI-бекенд можно, если хочется чтобы все совсем летало.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
15-1246625032
Nil
2009-07-03 16:43
2009.09.06
Есть кто-нибдуь кто знает Delphi, С и кому интересен доп зработок


2-1245366914
DimonS
2009-06-19 03:15
2009.09.06
Ошибка при подключении к *.xls


15-1246869777
b/@.
2009-07-06 12:42
2009.09.06
Простой вопрос по Format


2-1246968716
cyber-pilot
2009-07-07 16:11
2009.09.06
Формат даты


2-1246866808
smirnoff
2009-07-06 11:53
2009.09.06
Вопрос по AnsiChar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский