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

1,769 views

Published on

Краткий обзор существующих решений
Что такое web sockets
обеспечение работы web sockets на стороне сервера
основной механизм работы с web sockets в PHP
Нюансы использования

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,769
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Особенности примененияWebsocketна примере работы в ERPФролов Александр14.06.2013г.
  2. 2. Актуальность данных• Данные на странице — устаревают;• основании устаревших данных можно принять не верноерешение;• Не верное решение ведёт в конечном счёте к финансовымпотерям, если это приложение решает бизнес задачи.• Выход? Нужно получать данные от сервера в момент ихпоступления на сервер;• Нужно иметь возможность инициировать отправку данныхсервером.
  3. 3. Как быть, каким способомактуализировать данные?• Первый тривиальный способ — запрашивать каждые n секундсервер о новых данных.При этом чем чаще — тем быстрее получаем обновлениеданных.• Простой подсчёт показывает: в ERP системе за сутки будетгенерировать 2,5 миллиона запросов. КПД от работы системы —стремится к нулю.
  4. 4. Ограничения:согласно спецификации HTTP 1.1браузер не должен иметь более двухсоединений одновременно• Если открыто более двух страниц в браузере очень вероятныслучаи, когда запросы на обновление не проходят;• Применение других способов, отличных от простых запросов наобновления так же требует учитывать это обстоятельство;
  5. 5. Comet (программирование)• Модели работы веб приложений, при которых постоянное HTTPсоединение позволяет веб-серверу отправлять (push) данныебраузеру без дополнительного запроса со стороны браузера,называют Comet технологиями, а приложения, которыереализуют такую модель — comet приложениями.• Благодаря comet-приложениям клиент в режиме реальноговремени может взаимодействовать с сервером, опираясь напостоянное или long polling соединение HTTP.
  6. 6. Реализации comet технологий• Потоковые: открывается постоянное соединение междуклиентом и сервером.• Long polling (длительное соединения): открывается соединениеи ожидается ответ по таймауту или до таймаута, после чегосоединение переоткрывается
  7. 7. Потоковые: открывается постоянноесоединение между клиентом и сервером.Скрытый IFRAMEПостоянно в IFRAME шлются данные, например, строки с пустымкомментарием, и в нужный момент сервер передает javascriptстроку, которая сразу выполняется. Из минусов можновыделить не возможность нормальной обработки ошибок и невозможность отследить реакцию на передачу данных состороны сервера.
  8. 8. XMLHttpRequestУ ряда браузеров (FF, WebKit, IE10) имеется возможность получатьmultipart response — ответ порциями, тем самым очереднуюпорцию отсылаем тогда, когда нужно серверу. Особогораспространения не получило.
  9. 9. Ajax с long pollingБраузер делает Ajax запрос на сервер, который остаетсяоткрытым, пока сервер не отправит данные. По таймаутупересоздается соединение.
  10. 10. Script tag long pollingПодгружается динамически javascript файлы, в которыхпередаются данные по мере их поступления. Как только одинфайл «загрузился», подгружается следующий файл.
  11. 11. WebSocketWebSocket - веб-технология, обеспечивает полнодуплексныйканал связи через одно соединение TCP. Протокол WebSocketбыл стандартизирован IETF RFC 6455 в 2011 году. WebSocketсоответствует стандартам W3C.
  12. 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. 13. Немного деталей :)Процесс открытия WS выглядит на данныймомент следующим образом.
  14. 14. В начале идёт HTTP-запрос:GET /ws HTTP/1.1Host: site.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://site.com
  15. 15. Если сервер поддерживает WS,то то ответ будет:HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=Sec-WebSocket-Protocol: chat
  16. 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. 17. Формат передаваемых текстовых данных0x00 <строка в кодировке UTF-8> 0xFFпросто строка текста — последовательность байт, к которойспереди приставлен нулевой байт 0x00, а в конце — 0xFF.И все — никаких заголовков, метаданных.
  18. 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. 19. Какими браузерами поддерживается?Protocol IE FF FF(android)Chrome Safari Operahixie-75 4 5.0.0hixie-76hybi-004 6 5.0.1 117 hybi-07 68 hybi-10 7 7 1413 RFC 6455 10 11 11 16 6 12.10
  20. 20. Организации работы WSРазличные реализации серверов на многих платформах:node.js, Pyton, Ruby on Rails, PHP...Из PHP Open Source проектов можно отметить довольно динамичноразвивающийся проект phpDeamon. Но это универсальныйвсеядный комбайн.Но в реальности используем более легкую реализацию, которуюпроще проверить и адаптировать под свои нужды.(https://github.com/lemmingzshadow/php-websocket)
  21. 21. Принцип работы WS сервера на php- запуск в цикле опроса открытых портов.while(true) {foreach($sockets as $socket) {// read socket$data = readBuffer($socket);process_data($cleint[(int)$socket], $data);}}
  22. 22. Обычная схема работыБДWSК
  23. 23. Схема быстрого внедрения WSБДWSК2КnК1WSSAjaxmessmessmessmessMess — сообщениеОб изменениях, длявсех одно и тоже,фильтрация «нужен /не нужен» или на сторонеклиента или решение обОтправки mess принимаетWSS исходя из типастраницы на строне клиента.
  24. 24. Продвинутая схема использования WSБДWSК2КnК1WSSAjaxmessmnm2m1mess — сообщениеоб измененияхM1, M2, … Mn —подготовленные длякаждого типа страницсообщения, включающиевсе специфическиеданные. Не достающиеданные добираются из БД.
  25. 25. Полная интеграция WSБДWSК2КnК1WSSHTTPm0mnm2m1
  26. 26. Конкурирующие запросы• С ростом количества запросов может быть ситуация, когдаданные более свежего запроса придут позже, чем данныеболее старого запроса.• Необходимо посылать с данными на изменения временныеметки, чтобы обеспечить минимальную защиту от подобныхколлизий;• Так же нужна временная метка о начале работы с данными, тоесть когда пришли данные, которые отредактировали;• Две временные метки позволяют сравнить данные, которыеменяем с данными которые находятся в БД, а так же их«свежесть» и в случае чего не допустить перезатирания новыхданных — старыми. При этом клиенту, приславшегоконфликтный запрос — отправлять уведомление с просьбойпроверки данных + обновленные данные.
  27. 27. Стоит ли использоватьболее серьёзный подход?• Можно использовать систему разделения ресурсов,флаги, семафоры...• Внедрение связано со значительным усложнениемвсей системы;• От пользователе потребуются дополнительные усилия в работе;• Необходимо четко очень реальную необходимость внедрения.
  28. 28. Пишите логиВ обязательном порядке записываете в логахобо всех изменениях в системе:• кто• когда• что• старое значение• новое значение
  29. 29. Собирайте мусор в WSSWSS представляет собой один работающий процесс поприему, обработке и отправке сообщений. Со временем неиспользуемые переменные постепенно забивают память вплотьмаксимально возможного лимита для php процесса. Чтобыэтого не случилось необходимо подчищать за собойпеременные и объекты (gc_enble(); gc_collect_cycles();gc_disable; )
  30. 30. Перегружайте WSS иногда :)gc_collect_cycles() помогает, но объем используемой памяти всёравно может неуклонно расти.Поэтому проверяйте объём используемой памяти, и в случаепревышения определенного лимита инициируйте перезагрузкуWSS.
  31. 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. 32. Возможности «виртуального» кэша• Так как процесс обрабатывающий сообщения один, то исохраняя данные в определенный массив/объект можнополучить нечто на подобие кэша с актуальными данными;• Следует учитывать ограничения на объём памяти и не забыватьподчищать такой кэш.• Определив экспериментальным путем суточные потребностиERP системы были увеличены лимиты с 128Мб, до 1Гб памятидля WSS, тем самым все необходимые для работы данные врезультате находились в кэше.• В PHP 5.3.0 можно указывать в php.ini memory_limit 1G
  33. 33. Ссылки на ресурсы, статьи, GitHubhttp://en.wikipedia.org/wiki/Comet_(programming)http://en.wikipedia.org/wiki/WebSockethttps://github.com/nicokaiser/php-websockethttp://nginx.com/news/nginx-websockets.htmlhttps://github.com/disconnect/apache-websockethttps://github.com/kakserpom/phpdaemonhttps://github.com/nicokaiser/php-websockethttps://github.com/hoaproject/Websockethttps://github.com/lemmingzshadow/php-websocket
  34. 34. Докладчик: Фролов Александрalex.frolov@gmail.com@alex__frolovhttps://www.facebook.com/frolov.alexander

×