LINUX.ORG.RU

А как сейчас в вебе кошерно делать нотификацию клиента?


0

0

Возьмем для примера гипотетическую онлайн-игру в карты, допустим в дурака... или преферанс. Допустим есть задача сделать ее на чистом вебе (html+css+javascript). Как в таком случае делать оповещение клиента о событиях (например о том, что партнер сделал ход)? На ум приходит три решения:

1 - делаем джаваскриптом опрос сервера о событиях (например каждые пару секунд шлем аяксовый запрос, и если в ответ пришло событие реагируем). Минусы - сильно растущее количество запросов на сервак + довольно сильно заметные задержки при хорошем канале.

2 - шлем тем-же аяксом запрос на сервер, выставляем ему большой таймаут и ждем ответа, который придет только по наступлению события. Минусы - огромное количество активных тредов на сервере (т.е. thread возвращается в пул как только выплюнул ответ, но здесь же будет куча висящих).

3 - плюем на требование чистого веба и впихиваем на сайт жабо-апплет (или флеш, если он нормальные сокеты умеет) с полнодуплексным соединением. Минусы - нарушение т.з. и х.з. как будет работать через проксю.

Может могучий коллективный разум подскажет еще какие варианты?

★★★★

WebSocket. Это в идеальном мире конечно, прямо вот сейчас его де-факто только хром поддерживает. Через полгода будет нормальная поддержка всеми_кроме_ie. Flash xmlsocket вроде часто для таких штук используют.

4) comet, но лучше не надо, оно все на хаках построено, и работает опять же или поверх аякса, или флеша.

volh ★★
()

А что вам не нравится в первом варианте? Сделайте на том же JS функцию-анализатор скорости сети (отправили запрос, засекли время, получили ответ - вычислили задержку), и выставляйте таймаут как функцию этой задержки (например, помножив ее на 5, но не меньше, скажем, одной секунды). Отправляем пустой запрос, в ответ на него сервер отправляет, скажем, 1, если событие наступило, или 0, если его нет. При этом трафик почти не съедается (особенно, если не мудрить с шапками).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Так привык к ограничениям веба, что хочется обязательно пилить свой самокат?

А что вам не нравится в первом варианте?


Некошерно и убиватьубиватьубивать.

volh ★★
()
Ответ на: комментарий от Eddy_Em

>А что вам не нравится в первом варианте

Количество запросов на сервер. Допустим у нас ~1000 клиентов. И средний интевал между запросами ~2 секунд. Лишних 500 запросов в секунду как-то жирновато будет, особенно при условии того что нам надо на каждый из этих запросов взять поток из пула, распарсить headers, выполнить какую-то логику, сформировать ответ.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от yltsrc

>можно посмотреть в сторону comet

ок, thanks, посмотрю, почитаю.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от volh

>Это в идеальном мире конечно, прямо вот сейчас его де-факто только хром поддерживает

Ах, как хочется сказать, что маргинальные пользователи кривых поделок типа IE меня не интересуют...

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Nagwal

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

volh ★★
()

Забей, все онлайн казино чисто на flash работают. xmlsocket.

Anoxemian ★★★★★
()
Ответ на: комментарий от volh

>Ну, если нужно прямо сейчас и рабочее, то о кошерности речи быть не может - все говно в той или иной степени, и придется использовать хаки, подпорки, ухищрения.

Не, речь скорее о том, как правильно и кошерно. Проект еще даже не на стадии написания т.з. Просто пркидываю что и как в теории можно сделать. Но ослика ие выкинуть не получится из списка поддерживаемых. Разве что похерить поддержку шестого можно.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Nagwal

Имхо, какой-нибудь comet сервер, работающий поверх xmlsocket. Чтобы, когда WebSocket станут использоваться повсеместно ( вроде в ie9 будут? ), просто переписать бэкенд. К тому же, более-менее абстрактный comet server может автоматически выбирать бэкенд, если у клиента не установлен Flash, например. Конкретного сервера не назову, все слишком быстро меняется.

volh ★★
()
Ответ на: комментарий от Nagwal

> Количество запросов на сервер. Допустим у нас ~1000 клиентов. И средний интевал между запросами ~2 секунд. Лишних 500 запросов в секунду как-то жирновато будет, особенно при условии того что нам надо на каждый из этих запросов взять поток из пула, распарсить headers, выполнить какую-то логику, сформировать ответ.

Выдуманная проблема. Никто не заставляет на поллинг обновления гонять полный XML только ради того, чтобы узнать, появились данные или нет. А так есть nginx, который умеет результаты из memcached по ключу вынимать. Там ваши 1000 запросов в секунду на пол зуба.

Это только для примера. Ну и про comet вам уже говорили. Все решаемо. Думайте :)

Vit ★★★★★
()

SSE

(если это то, что я думаю, то) По идее есть Server-Sent Events, но есть оно только в теории, если память мне не изменяет. В Опере работало, разве что. Но судя по тексту, «Implementors should be aware that this specification is not stable» блабла и т.д.

Deleted
()
Ответ на: комментарий от Vit

Выдуманная проблема. Никто не заставляет на поллинг обновления гонять полный XML только ради того, чтобы узнать, появились данные или нет. А так есть nginx, который умеет результаты из memcached по ключу вынимать. Там ваши 1000 запросов в секунду на пол зуба.

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

Опять же, зачем в картах делать опрос раз в секунду? Можно и раз в пять или в десять секунд. Или же дать юзеру тупо кнопочку 'Refresh' и, если ему так хочется, пусть жмет с какой хочет скоростью. Если же ему не хочется, то поставить вменяемый таймаут на опрос и забить.

Кометы, вебсокеты и пр. херня - вам сегодня делать или шашечки?

bibi
()
Ответ на: комментарий от bibi

Ну да. Постгрес, Оракел, ДБА нанимать.. Что за херня вообще, если можно в файлах все хранить? Вы шо, умные шоли? Юниксвей же!

volh ★★
()
Ответ на: комментарий от bibi

>Кометы, вебсокеты и пр. херня - вам сегодня делать или шашечки?

Мне, скажем так, послезавтра ;) Проект по началу не коммерческий, будет делаться на добровольных началах. Может быть даже потом - с открытыми исходниками. Так что есть время написать его более-менее правильно, без особых костылей.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от thevery

> называется comet. существуют вполне себе эффективные его реализации.

Хоть одна работает через проксю корректно? И шобы при этом отклик не через 5 минут, и сотни нефти^Wтрафа не пользовало?

simple_best_world_web_master
()
Ответ на: комментарий от simple_best_world_web_master

или флеш, если он нормальные сокеты умеет

есть как xmlsocket (как в жаббере - все по xml гоняет), так и raw начиная с девятки

Вот только не надо всякую гадость советовать. И так в интернетах этих флешей столько развелось, что порой и на сайт попасть не можешь, т.к. какой-то идиот сделал вход на флеше.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

У меня для тебя плохие новости. Страниц, для которых разрабатывался html, уже давно никто не делают. Делают RIA. А для них лучше всего использовать флеш или сильверлайт.

simple_best_world_web_master
()
Ответ на: комментарий от simple_best_world_web_master

Страниц, для которых разрабатывался html, уже давно никто не делают. Делают RIA. А для них лучше всего использовать флеш или сильверлайт.

Так делают сайты «IE-only», а если хотите, чтобы ваш сайт посещали, надо стандарты выполнять. И флеш не использовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от simple_best_world_web_master

И вот по стандартам сделать нельзя, да? С использованием минимальных запросов. Можно подумать, сервер сдохнет от обработки сотни-другой запросов в секунду, причем длина запроса-то не больше ста байт...

Eddy_Em ☆☆☆☆☆
()

>А как сейчас в вебе кошерно делать нотификацию клиента?

делать нотификацию клиента

Что, совсем русские слова позабывали? Делать нотификацию = извещать, известить; нотификейшн = извещение. Я понимаю использование сокращений типа «омг», ибо это действительно сокращение(уменьшение кол-ва символов при сохранении смысла), но такое корявое и уродское смешение русского и английского не вызывает ничего, кроме ненависти.

С пожеланием всего наилучшего,

razdva
()
Ответ на: комментарий от simple_best_world_web_master

ээ.. прокся и всё такое - это клиент-сайд, он от реализации сервера в данном случае не зависит, ибо всё ходит через всё тот же http

thevery ★★★★
()
Ответ на: комментарий от Eddy_Em

Не сервер, так клиент, особенно когда у меня канал в 128 килобит и 10 пиров на торрентах. Один запрос пропадет и встанет вся игрушка. Очень глобально и надежно. А если сидишь через жопорез, так еще и на бабки попадешь

simple_best_world_web_master
()
Ответ на: комментарий от thevery

только приходит уже позно, когда оно уже не нужно. Если вообще приходит (т.е. сервер не будет ждать конца «файла», дабы закешировать его и проверить антивирем, например)

simple_best_world_web_master
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.