SlideShare a Scribd company logo
1 of 34
Особенности применения
Websocket
на примере работы в ERP
Фролов Александр
14.06.2013г.
Актуальность данных
• Данные на странице — устаревают;
• основании устаревших данных можно принять не верное
решение;
• Не верное решение ведёт в конечном счёте к финансовым
потерям, если это приложение решает бизнес задачи.
• Выход? Нужно получать данные от сервера в момент их
поступления на сервер;
• Нужно иметь возможность инициировать отправку данных
сервером.
Как быть, каким способом
актуализировать данные?
• Первый тривиальный способ — запрашивать каждые n секунд
сервер о новых данных.
При этом чем чаще — тем быстрее получаем обновление
данных.
• Простой подсчёт показывает: в ERP системе за сутки будет
генерировать 2,5 миллиона запросов. КПД от работы системы —
стремится к нулю.
Ограничения:
согласно спецификации HTTP 1.1
браузер не должен иметь более двух
соединений одновременно
• Если открыто более двух страниц в браузере очень вероятны
случаи, когда запросы на обновление не проходят;
• Применение других способов, отличных от простых запросов на
обновления так же требует учитывать это обстоятельство;
Comet (программирование)
• Модели работы веб приложений, при которых постоянное HTTP
соединение позволяет веб-серверу отправлять (push) данные
браузеру без дополнительного запроса со стороны браузера,
называют Comet технологиями, а приложения, которые
реализуют такую модель — comet приложениями.
• Благодаря comet-приложениям клиент в режиме реального
времени может взаимодействовать с сервером, опираясь на
постоянное или long polling соединение HTTP.
Реализации comet технологий
• Потоковые: открывается постоянное соединение между
клиентом и сервером.
• Long polling (длительное соединения): открывается соединение
и ожидается ответ по таймауту или до таймаута, после чего
соединение переоткрывается
Потоковые: открывается постоянное
соединение между клиентом и сервером.
Скрытый IFRAME
Постоянно в IFRAME шлются данные, например, строки с пустым
комментарием, и в нужный момент сервер передает javascript
строку, которая сразу выполняется. Из минусов можно
выделить не возможность нормальной обработки ошибок и не
возможность отследить реакцию на передачу данных со
стороны сервера.
XMLHttpRequest
У ряда браузеров (FF, WebKit, IE10) имеется возможность получать
multipart response — ответ порциями, тем самым очередную
порцию отсылаем тогда, когда нужно серверу. Особого
распространения не получило.
Ajax с long polling
Браузер делает Ajax запрос на сервер, который остается
открытым, пока сервер не отправит данные. По таймауту
пересоздается соединение.
Script tag long polling
Подгружается динамически javascript файлы, в которых
передаются данные по мере их поступления. Как только один
файл «загрузился», подгружается следующий файл.
WebSocket
WebSocket - веб-технология, обеспечивает полнодуплексный
канал связи через одно соединение TCP. Протокол WebSocket
был стандартизирован IETF RFC 6455 в 2011 году. WebSocket
соответствует стандартам W3C.
Базовое использование
WebSocket на стороне клиента:
<script>
ws = new WebSocket("ws://site.com/ws");
// обработка события, при установки соединения
ws.onopen = function() { alert("Connection opened...") };
// обработка события, при закрытии соединения
ws.onclose = function() { alert("Connection closed...") };
// обработка события получения сообщение через веб-сокет
ws.onmessage = function(e) { alert(e.data); };
</script>
Немного деталей :)
Процесс открытия WS выглядит на данный
момент следующим образом.
В начале идёт HTTP-запрос:
GET /ws HTTP/1.1
Host: site.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://site.com
Если сервер поддерживает WS,
то то ответ будет:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Key содержит случайное значение,
закодированное Base64.
Sec-WebSocket-Accept вычисляется путём
конкатенации Sec-WebSocket-Key и «magic string»:
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
$SecWebSocketAccept = base64_encode(sha1($SecWebSocketKey .
'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
Существует две модификации протокола: ws:// и wss://,
это по смыслу почти как http:// и https://,
то есть wss:// - шифрованное соединение.
Формат передаваемых текстовых данных
0x00 <строка в кодировке UTF-8> 0xFF
просто строка текста — последовательность байт, к которой
спереди приставлен нулевой байт 0x00, а в конце — 0xFF.
И все — никаких заголовков, метаданных.
Передача и бинарных данных
Длина записывается по следующим правилам: Каждый байт в
указании длины рассматривается по частям: самый старший бит
указывает является ли этот байт последним (0) либо же за ним
есть другие (1), а младшие 7 битов содержат собственно
данные.
0x80 <длина - один или несколько байт> <тело сообщения>
1 0 0 0 1 1 1 01 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0
Какими браузерами поддерживается?
Protocol IE FF FF
(android)
Chrome Safari Opera
hixie-75 4 5.0.0
hixie-76
hybi-00
4 6 5.0.1 11
7 hybi-07 6
8 hybi-10 7 7 14
13 RFC 6455 10 11 11 16 6 12.10
Организации работы WS
Различные реализации серверов на многих платформах:
node.js, Pyton, Ruby on Rails, PHP...
Из PHP Open Source проектов можно отметить довольно динамично
развивающийся проект phpDeamon. Но это универсальный
всеядный комбайн.
Но в реальности используем более легкую реализацию, которую
проще проверить и адаптировать под свои нужды.
(https://github.com/lemmingzshadow/php-websocket)
Принцип работы WS сервера на php
- запуск в цикле опроса открытых портов.
while(true) {
foreach($sockets as $socket) {
// read socket
$data = readBuffer($socket);
process_data($cleint[(int)$socket], $data);
}
}
Обычная схема работы
БД
W
SК
Схема быстрого внедрения WS
БД
W
S
К2
Кn
К1
W
S
S
Ajax
mess
mess
mess
mess
Mess — сообщение
Об изменениях, для
всех одно и тоже,
фильтрация «нужен /
не нужен» или на стороне
клиента или решение об
Отправки mess принимает
WSS исходя из типа
страницы на строне клиента.
Продвинутая схема использования WS
БД
W
S
К2
Кn
К1
W
S
S
Ajax
mess
mn
m2
m1
mess — сообщение
об изменениях
M1, M2, … Mn —
подготовленные для
каждого типа страниц
сообщения, включающие
все специфические
данные. Не достающие
данные добираются из БД.
Полная интеграция WS
БД
W
S
К2
Кn
К1
W
S
S
HTTP
m0
mn
m2
m1
Конкурирующие запросы
• С ростом количества запросов может быть ситуация, когда
данные более свежего запроса придут позже, чем данные
более старого запроса.
• Необходимо посылать с данными на изменения временные
метки, чтобы обеспечить минимальную защиту от подобных
коллизий;
• Так же нужна временная метка о начале работы с данными, то
есть когда пришли данные, которые отредактировали;
• Две временные метки позволяют сравнить данные, которые
меняем с данными которые находятся в БД, а так же их
«свежесть» и в случае чего не допустить перезатирания новых
данных — старыми. При этом клиенту, приславшего
конфликтный запрос — отправлять уведомление с просьбой
проверки данных + обновленные данные.
Стоит ли использовать
более серьёзный подход?
• Можно использовать систему разделения ресурсов,
флаги, семафоры...
• Внедрение связано со значительным усложнением
всей системы;
• От пользователе потребуются дополнительные усилия в работе;
• Необходимо четко очень реальную необходимость внедрения.
Пишите логи
В обязательном порядке записываете в логах
обо всех изменениях в системе:
• кто
• когда
• что
• старое значение
• новое значение
Собирайте мусор в WSS

WSS представляет собой один работающий процесс по
приему, обработке и отправке сообщений. Со временем не
используемые переменные постепенно забивают память вплоть
максимально возможного лимита для php процесса. Чтобы
этого не случилось необходимо подчищать за собой
переменные и объекты (gc_enble(); gc_collect_cycles();
gc_disable; )
Перегружайте WSS иногда :)
gc_collect_cycles() помогает, но объем используемой памяти всё
равно может неуклонно расти.
Поэтому проверяйте объём используемой памяти, и в случае
превышения определенного лимита инициируйте перезагрузку
WSS.
Пример упрощенного кода ядра WSS
$flag = true;
While ($flag) {
If (time() - $time_last_check >= 60 сек) {
If (get_file_flag() == 1) {
$flag = false;
} else if (memory_get_peak_usage()/1024/1024
>= ini_get("memory_limit") * 0.8) {
send_notice(); set_timer_to_reboot();
$flag = false();
}
}
}
Возможности «виртуального» кэша
• Так как процесс обрабатывающий сообщения один, то и
сохраняя данные в определенный массив/объект можно
получить нечто на подобие кэша с актуальными данными;
• Следует учитывать ограничения на объём памяти и не забывать
подчищать такой кэш.
• Определив экспериментальным путем суточные потребности
ERP системы были увеличены лимиты с 128Мб, до 1Гб памяти
для WSS, тем самым все необходимые для работы данные в
результате находились в кэше.
• В PHP 5.3.0 можно указывать в php.ini memory_limit 1G
Ссылки на ресурсы, статьи, GitHub
http://en.wikipedia.org/wiki/Comet_(programming)
http://en.wikipedia.org/wiki/WebSocket
https://github.com/nicokaiser/php-websocket
http://nginx.com/news/nginx-websockets.html
https://github.com/disconnect/apache-websocket
https://github.com/kakserpom/phpdaemon
https://github.com/nicokaiser/php-websocket
https://github.com/hoaproject/Websocket
https://github.com/lemmingzshadow/php-websocket
Докладчик: Фролов Александр
alex.frolov@gmail.com
@alex__frolov
https://www.facebook.com/frolov.alexander

More Related Content

What's hot

08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backendRoman Brovko
 
06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTP06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTPRoman Brovko
 
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...KazHackStan
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...KazHackStan
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxYandex
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервераRoman Brovko
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Socketsguest092df8
 
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemТатьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemKazHackStan
 
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»Tanya Denisyuk
 
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...KazHackStan
 
Браузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачемБраузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачемPavel Klimiankou
 
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»Tanya Denisyuk
 
Продвинутая web-отладка с Fiddler
Продвинутая web-отладка с FiddlerПродвинутая web-отладка с Fiddler
Продвинутая web-отладка с FiddlerAlexander Feschenko
 
Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"Yandex
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_rumcroitor
 

What's hot (20)

Periculum est in mora
Periculum est in moraPericulum est in mora
Periculum est in mora
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend
 
06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTP06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTP
 
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
 
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
Иван Чалыкин (Россия), Digital Security. Легальный SOP Bypass. Проблемы внедр...
 
KazHackStan 2017 | Tracking
KazHackStan 2017 | TrackingKazHackStan 2017 | Tracking
KazHackStan 2017 | Tracking
 
HTTP протокол
HTTP протоколHTTP протокол
HTTP протокол
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 
WWW
WWWWWW
WWW
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotemТатьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
Татьяна Новикова (Казахстан), ЦАРКА. Как мы мониторим Казнет с помощью WebTotem
 
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
 
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
Андрей Абакумов (Россия). Yandex.ru. Соавтор: Эльдар Заитов. Автоматизация ск...
 
Браузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачемБраузерные API обмена данными: какие и зачем
Браузерные API обмена данными: какие и зачем
 
Fiddler
FiddlerFiddler
Fiddler
 
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
 
Продвинутая web-отладка с Fiddler
Продвинутая web-отладка с FiddlerПродвинутая web-отладка с Fiddler
Продвинутая web-отладка с Fiddler
 
Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
 

Viewers also liked

Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Yandex
 
Real-Time Web: Consumers and Brands
Real-Time Web: Consumers and BrandsReal-Time Web: Consumers and Brands
Real-Time Web: Consumers and BrandsSasha Kovaliov
 
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"Yandex
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Do the Software Architects get the Needed Support for the job They Perform?
Do the Software Architects get the Needed Support for the job They Perform?Do the Software Architects get the Needed Support for the job They Perform?
Do the Software Architects get the Needed Support for the job They Perform?Kresimir Popovic
 

Viewers also liked (7)

HTML5 WebSockets and WebWorkers
HTML5 WebSockets and WebWorkersHTML5 WebSockets and WebWorkers
HTML5 WebSockets and WebWorkers
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
 
Real-Time Web: Consumers and Brands
Real-Time Web: Consumers and BrandsReal-Time Web: Consumers and Brands
Real-Time Web: Consumers and Brands
 
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Do the Software Architects get the Needed Support for the job They Perform?
Do the Software Architects get the Needed Support for the job They Perform?Do the Software Architects get the Needed Support for the job They Perform?
Do the Software Architects get the Needed Support for the job They Perform?
 
Joel Roberts
Joel RobertsJoel Roberts
Joel Roberts
 

Similar to DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.

FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоАлександр Ежов
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеAlexey Androsov
 
SignalR
SignalRSignalR
SignalRmstDe3
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSYandex
 
Михаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxМихаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxYandex
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)Mikhail Davydov
 
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...Ontico
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...ForkConf
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBASlach
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныSergey Xek
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Ontico
 
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tips
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tipsКостянтин Чаус — Monitoring of huge Drupal site. Tools and tips
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tipsLEDC 2016
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 

Similar to DevConf2013: Особенности применения WebSocket на примере работы в ERP системе. (20)

FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это просто
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.Почте
 
SignalR
SignalRSignalR
SignalR
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Веб-сервер
Веб-серверВеб-сервер
Веб-сервер
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Михаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxМихаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajax
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)Ajax and Transports (in russian)
Ajax and Transports (in russian)
 
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
Как превратить Openstack Swift в хранилище для высоких нагрузок разных типов,...
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
 
Sivko
SivkoSivko
Sivko
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяны
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)
 
Web servers
Web servers Web servers
Web servers
 
Errors Tracker
Errors TrackerErrors Tracker
Errors Tracker
 
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tips
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tipsКостянтин Чаус — Monitoring of huge Drupal site. Tools and tips
Костянтин Чаус — Monitoring of huge Drupal site. Tools and tips
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 

DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.

  • 1. Особенности применения Websocket на примере работы в ERP Фролов Александр 14.06.2013г.
  • 2. Актуальность данных • Данные на странице — устаревают; • основании устаревших данных можно принять не верное решение; • Не верное решение ведёт в конечном счёте к финансовым потерям, если это приложение решает бизнес задачи. • Выход? Нужно получать данные от сервера в момент их поступления на сервер; • Нужно иметь возможность инициировать отправку данных сервером.
  • 3. Как быть, каким способом актуализировать данные? • Первый тривиальный способ — запрашивать каждые n секунд сервер о новых данных. При этом чем чаще — тем быстрее получаем обновление данных. • Простой подсчёт показывает: в ERP системе за сутки будет генерировать 2,5 миллиона запросов. КПД от работы системы — стремится к нулю.
  • 4. Ограничения: согласно спецификации HTTP 1.1 браузер не должен иметь более двух соединений одновременно • Если открыто более двух страниц в браузере очень вероятны случаи, когда запросы на обновление не проходят; • Применение других способов, отличных от простых запросов на обновления так же требует учитывать это обстоятельство;
  • 5. Comet (программирование) • Модели работы веб приложений, при которых постоянное HTTP соединение позволяет веб-серверу отправлять (push) данные браузеру без дополнительного запроса со стороны браузера, называют Comet технологиями, а приложения, которые реализуют такую модель — comet приложениями. • Благодаря comet-приложениям клиент в режиме реального времени может взаимодействовать с сервером, опираясь на постоянное или long polling соединение HTTP.
  • 6. Реализации comet технологий • Потоковые: открывается постоянное соединение между клиентом и сервером. • Long polling (длительное соединения): открывается соединение и ожидается ответ по таймауту или до таймаута, после чего соединение переоткрывается
  • 7. Потоковые: открывается постоянное соединение между клиентом и сервером. Скрытый IFRAME Постоянно в IFRAME шлются данные, например, строки с пустым комментарием, и в нужный момент сервер передает javascript строку, которая сразу выполняется. Из минусов можно выделить не возможность нормальной обработки ошибок и не возможность отследить реакцию на передачу данных со стороны сервера.
  • 8. XMLHttpRequest У ряда браузеров (FF, WebKit, IE10) имеется возможность получать multipart response — ответ порциями, тем самым очередную порцию отсылаем тогда, когда нужно серверу. Особого распространения не получило.
  • 9. Ajax с long polling Браузер делает Ajax запрос на сервер, который остается открытым, пока сервер не отправит данные. По таймауту пересоздается соединение.
  • 10. Script tag long polling Подгружается динамически javascript файлы, в которых передаются данные по мере их поступления. Как только один файл «загрузился», подгружается следующий файл.
  • 11. WebSocket WebSocket - веб-технология, обеспечивает полнодуплексный канал связи через одно соединение TCP. Протокол WebSocket был стандартизирован IETF RFC 6455 в 2011 году. WebSocket соответствует стандартам W3C.
  • 12. Базовое использование WebSocket на стороне клиента: <script> ws = new WebSocket("ws://site.com/ws"); // обработка события, при установки соединения ws.onopen = function() { alert("Connection opened...") }; // обработка события, при закрытии соединения ws.onclose = function() { alert("Connection closed...") }; // обработка события получения сообщение через веб-сокет ws.onmessage = function(e) { alert(e.data); }; </script>
  • 13. Немного деталей :) Процесс открытия WS выглядит на данный момент следующим образом.
  • 14. В начале идёт HTTP-запрос: GET /ws HTTP/1.1 Host: site.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13 Origin: http://site.com
  • 15. Если сервер поддерживает WS, то то ответ будет: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
  • 16. Sec-WebSocket-Key содержит случайное значение, закодированное Base64. Sec-WebSocket-Accept вычисляется путём конкатенации Sec-WebSocket-Key и «magic string»: 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 $SecWebSocketAccept = base64_encode(sha1($SecWebSocketKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)); Существует две модификации протокола: ws:// и wss://, это по смыслу почти как http:// и https://, то есть wss:// - шифрованное соединение.
  • 17. Формат передаваемых текстовых данных 0x00 <строка в кодировке UTF-8> 0xFF просто строка текста — последовательность байт, к которой спереди приставлен нулевой байт 0x00, а в конце — 0xFF. И все — никаких заголовков, метаданных.
  • 18. Передача и бинарных данных Длина записывается по следующим правилам: Каждый байт в указании длины рассматривается по частям: самый старший бит указывает является ли этот байт последним (0) либо же за ним есть другие (1), а младшие 7 битов содержат собственно данные. 0x80 <длина - один или несколько байт> <тело сообщения> 1 0 0 0 1 1 1 01 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0
  • 19. Какими браузерами поддерживается? Protocol IE FF FF (android) Chrome Safari Opera hixie-75 4 5.0.0 hixie-76 hybi-00 4 6 5.0.1 11 7 hybi-07 6 8 hybi-10 7 7 14 13 RFC 6455 10 11 11 16 6 12.10
  • 20. Организации работы WS Различные реализации серверов на многих платформах: node.js, Pyton, Ruby on Rails, PHP... Из PHP Open Source проектов можно отметить довольно динамично развивающийся проект phpDeamon. Но это универсальный всеядный комбайн. Но в реальности используем более легкую реализацию, которую проще проверить и адаптировать под свои нужды. (https://github.com/lemmingzshadow/php-websocket)
  • 21. Принцип работы WS сервера на php - запуск в цикле опроса открытых портов. while(true) { foreach($sockets as $socket) { // read socket $data = readBuffer($socket); process_data($cleint[(int)$socket], $data); } }
  • 23. Схема быстрого внедрения WS БД W S К2 Кn К1 W S S Ajax mess mess mess mess Mess — сообщение Об изменениях, для всех одно и тоже, фильтрация «нужен / не нужен» или на стороне клиента или решение об Отправки mess принимает WSS исходя из типа страницы на строне клиента.
  • 24. Продвинутая схема использования WS БД W S К2 Кn К1 W S S Ajax mess mn m2 m1 mess — сообщение об изменениях M1, M2, … Mn — подготовленные для каждого типа страниц сообщения, включающие все специфические данные. Не достающие данные добираются из БД.
  • 26. Конкурирующие запросы • С ростом количества запросов может быть ситуация, когда данные более свежего запроса придут позже, чем данные более старого запроса. • Необходимо посылать с данными на изменения временные метки, чтобы обеспечить минимальную защиту от подобных коллизий; • Так же нужна временная метка о начале работы с данными, то есть когда пришли данные, которые отредактировали; • Две временные метки позволяют сравнить данные, которые меняем с данными которые находятся в БД, а так же их «свежесть» и в случае чего не допустить перезатирания новых данных — старыми. При этом клиенту, приславшего конфликтный запрос — отправлять уведомление с просьбой проверки данных + обновленные данные.
  • 27. Стоит ли использовать более серьёзный подход? • Можно использовать систему разделения ресурсов, флаги, семафоры... • Внедрение связано со значительным усложнением всей системы; • От пользователе потребуются дополнительные усилия в работе; • Необходимо четко очень реальную необходимость внедрения.
  • 28. Пишите логи В обязательном порядке записываете в логах обо всех изменениях в системе: • кто • когда • что • старое значение • новое значение
  • 29. Собирайте мусор в WSS  WSS представляет собой один работающий процесс по приему, обработке и отправке сообщений. Со временем не используемые переменные постепенно забивают память вплоть максимально возможного лимита для php процесса. Чтобы этого не случилось необходимо подчищать за собой переменные и объекты (gc_enble(); gc_collect_cycles(); gc_disable; )
  • 30. Перегружайте WSS иногда :) gc_collect_cycles() помогает, но объем используемой памяти всё равно может неуклонно расти. Поэтому проверяйте объём используемой памяти, и в случае превышения определенного лимита инициируйте перезагрузку WSS.
  • 31. Пример упрощенного кода ядра WSS $flag = true; While ($flag) { If (time() - $time_last_check >= 60 сек) { If (get_file_flag() == 1) { $flag = false; } else if (memory_get_peak_usage()/1024/1024 >= ini_get("memory_limit") * 0.8) { send_notice(); set_timer_to_reboot(); $flag = false(); } } }
  • 32. Возможности «виртуального» кэша • Так как процесс обрабатывающий сообщения один, то и сохраняя данные в определенный массив/объект можно получить нечто на подобие кэша с актуальными данными; • Следует учитывать ограничения на объём памяти и не забывать подчищать такой кэш. • Определив экспериментальным путем суточные потребности ERP системы были увеличены лимиты с 128Мб, до 1Гб памяти для WSS, тем самым все необходимые для работы данные в результате находились в кэше. • В PHP 5.3.0 можно указывать в php.ini memory_limit 1G
  • 33. Ссылки на ресурсы, статьи, GitHub http://en.wikipedia.org/wiki/Comet_(programming) http://en.wikipedia.org/wiki/WebSocket https://github.com/nicokaiser/php-websocket http://nginx.com/news/nginx-websockets.html https://github.com/disconnect/apache-websocket https://github.com/kakserpom/phpdaemon https://github.com/nicokaiser/php-websocket https://github.com/hoaproject/Websocket https://github.com/lemmingzshadow/php-websocket