Step 4 (S-44899)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14835/step/4

Step 4 (S-44899) 1.png

[00:00 - 00:15] 1 из решений проблемы а вот этого шквал запросов при постинге а то что сервер не будет отвечать а до тех пор пока у него не появится да то есть а


[00:15 - 00:33] каждый клиент а полинге делает запросы практически сразу получает ответ а либо с данными либо без них а технология комета комета как тебя называют она же лонг поллинг предусматривает другой подход


[00:33 - 00:48] комет сервер отвечает не отвечает пользователю до тех пор пока у него не появится да а рассмотрим это на свете вот у нас есть клиент например браузер


Step 4 (S-44899) 2.png

[00:48 - 01:06] он делает это такой запрос в нашем случае это аякс запрос по урлу мест а сервер принимает запрос но никак не дает ничего то есть он просто кагбэ делает вид что очень долго думает


[01:06 - 01:21] а в браузере в протоколе http timeout довольно большие и браузер может ожидать вполне может подождать несколько минут а в какой то момент времени


[01:21 - 01:38] какой то момент времени на сервере происходят события то есть пользователю приходит сообщение как только произошло сообщение а сервер сразу дает ответ с этим сообщением то есть между приходом сообщение и те моменты когда


[01:38 - 01:55] оно каждого пользователя проходит минимально возможное время ну то есть сколько сервера нужно для того чтобы переслать а ответ по сети а пользователь получает сообщение


[01:55 - 02:10] и повторяет свой запрос о здесь проходят тоже минимально возможное время там столько сколько нужно чтобы отработал javascript ну и + чтобы текст поместился на картинке а итак


[02:10 - 02:27] что мы видим мы видим что в нашем случае пользователь отправляет запросы не раз 5 секунд а раз а значительно больше интервал времени то есть отправляет запрос идет до тех пор пока не придет сообщение


[02:27 - 02:42] а на практике а есть лимит то есть сервер а на самом деле не всегда будет нуждаться сообщение у него есть там 1 2 минуты


[02:42 - 02:58] и прошествии от 0 2 минут он все таки ответят клиенту а без каких либо сообщений ну соответственно и я все равно повторить запрос то есть получается тоже самое только количество запросов значительно меньше


[02:58 - 03:12] а с точки зрения клиента практически ничего не поменялось мы можем посмотреть как реализуется соединение с сервером на стороне клиента вот на этом слайде


Step 4 (S-44899) 3.png

[03:12 - 03:30] а он очень похож на реализацию полинг есть 1 отличие смотрите здесь в сниппете нету функции интервал то есть а нету четкого вызвал по расписанию


[03:30 - 03:49] вместо этого есть функции а функция которая должна загрузить получить сервера сообщение что находится внутри этой функции ну во 1 осуществляют солях запрос


[03:49 - 04:04] запросов практически такой же здесь не указывается параметр сил а потому что обычно совета учитывают а либо


[04:04 - 04:23] ну и еще потому что за за время обработки сообщения вряд ли может прийти там 1 дополнительное но в принципе здесь тоже может параметров системы никакой особой роли не играет а итак аякс запрос точно такой же как при полете а однако что происходит у нас есть 2 обработчика


[04:23 - 04:41] 1 обработчик успешного ответа то есть когда сербы что ты ответил а у нас есть ли способ восполнить есть поле мес мы предполагаем что данные тоже придется же соня поэтому мы просто читаем поля метров


[04:41 - 04:56] и далее важный момент когда мы обработали сообщение сообщение заново вызываем самих себя то есть функция курсивное а в конце


[04:56 - 05:12] а в конце работы вызывает себя заново и запрос повторяется соответственно обработчик ошибки когда то по ошибке он состоит примерно из того же то есть он вызывает функцию идет коммент


[05:12 - 05:30] взывать к по другому отложенном виде есть у нас произошла какая то ошибка скорее всего в ближайшее время сервер тоже не ответят ему нужно дать какое то время а на исправление ситуации поэтому мы повторяю но


[05:30 - 05:47] с помощью мы откладываем вызов на 10 секунд а вот и все то есть функция get коммент аяксом загружать данные сервера и в конце своего выполнения а вызывает себя еще раз


[05:47 - 06:02] пока страница загружена эта функция будет себя вызывать но интервалы между вызовами определяется тем сколько времени будет отвечать


[06:02 - 06:21] почему я сказал так бы рекурсивно потому что на самом деле а вот это вот эти вызовы они происходят немножко в другом контексте то есть это коллбэки и на самом деле рекурсии не происходит то есть а это это не чистая рекурсор курсе


[06:21 - 06:40] поэтому такой вызов с т к вам в жалко я не припомню что здесь еще можно сказать ну вот это число время ошибки в лазить на фиксированное сколько нужно ждать с ошибки на практике то число делают увеличивающий увеличивающимся чтобы не перегружать конденсатора


[06:40 - 06:55] ну а однако то есть реализации на клиенте простая и от ольга не сильно отличается однако ситуация на сервере отличается


[06:55 - 07:10] критическим образом а дело в том что мы не можем обслуживать запросы а комете с помощью нашего обычного серого обычно мы подразумеваем что то


Step 4 (S-44899) 4.png

[07:10 - 07:26] например его языка режиме либо что то аналогичное ему то есть сервер который поддерживает ограниченное количество потоков процессов воркеров рабочих а в чем проблема дело в том что


[07:26 - 07:43] на каждого клиента который находится на сайте то есть на каждого пользователя онлайн у нас приходится 1 запрос поскольку это запрос не отвечаю до тех пор


[07:43 - 08:01] пор пока пользователь не получит сообщение то есть на каждого клиента у нас приходится 1 открытое сетевое соединение а если бы мы использовали режим кто на каждого пользователя приходился 1 обработчик то есть вправо 4 в 10000 нам потребовалось


[08:01 - 08:17] 10000 а процессов нашу аппликейшен сервер только для того чтобы реализовать вот комету а ну и как следствие 10000 потоков в базе данных что то плохо а поэтому


[08:17 - 08:34] сервер он и на диаграмме был обозначен как веб сервер сервер который работает по другой схеме как мы говорили в начале для того чтобы параллельно держать открытым большое количество соединений нам нужен а сервер


[08:34 - 08:52] работающий по вент модели а например таким сервера может являться it gets it gives some не путать не предоставляет по умолчанию функционал коммент сервер но для него есть а специальный модуль mod


[08:52 - 09:08] это довольно простое в использовании модуль который позволяет добавить функционал сервера а поэтому я предлагаю посмотреть как реализовано кроме серого именно с использованием данных технологиям день смотрит


Step 4 (S-44899) 5.png

[09:08 - 09:26] во 1 вам нужно получить ангины собранный с этим сервером как правило если устанавливать под debian пакет будет называться винкс extra других unix систем


[09:26 - 09:42] а это означает что дополнительные модули в нем будут либо собрать самостоятельно а пятак а для того чтобы реализовать функционал сервером гимсе нужно писать


Step 4 (S-44899) 6.png

[09:42 - 10:01] а 2 локейшен локейшен и локейшен локейшен listen а этот локейшен которые будут подключаться а пользователя в нашем случае он назывался мест в особенно название


[10:01 - 10:17] а что что указано внутри этого локейшен начнем с самого простого а content type указан то есть мы


[10:17 - 10:35] указываем что локейшен месарош будет отдаваться с контактом трусов а откуда брать номер канала то есть мы говорили что при а таких от соединениях реал тайм сообщение


[10:35 - 10:50] когда клиент подключается он должен указать с какого канала он будет подключать будет получать сообщения а данная конструкция устанавливает переменную


[10:50 - 11:06] эта переменная используется самим значения аргумента оксид оксид это то что было передано в get параметре сид то есть если в get параметре seat было передано 3


[11:06 - 11:21] то вот эта инструкция она запишет вот сюда вот шло 3 и может будет знать что у нас а 3 канал далее опция


Step 4 (S-44899) 7.png

[11:21 - 11:37] publish subscribe отказ означает что к этому каналу может подключиться несколько человек и сообщения будут отправляться всем то есть и подростков


[11:37 - 11:56] то есть данная схема реализует реализуются в чат чат комнату 1 пишет все получают а есть другие варианты когда сообщение будет доставляться только 1 ибо 1 попавшемуся либо вообще можно ограничить количество там подключившийся до 1


[11:56 - 12:12] и самая важная опция эту опцию а она как раз таки включают работу модуля mod push то есть это не на странице настройки она говорит


[12:12 - 12:29] том что в данном локейшена будут включаться пользователя которые ожидают получить реалтайм сообщение 2 локейшн publish нужен а для нас самих то есть это локейшен через который мы будем отправлять сообщение


[12:29 - 12:47] а здесь также указывается из какого аргумента брать а номер канала также румян seat используется а оказывается что мы не хотим хранить сообщение то есть если пользователя


[12:47 - 13:04] пользователи в данный момент небыл подключен то сообщение вообще не получат вы считаете что он был оффлайн указываем что данный колокейшен используются для отправки сообщения то есть нижней listen to получения верхней опции


[13:04 - 13:19] для отправки и важное ограничение разрешить запросы с локальной машины запретить ото всех сторон


[13:19 - 13:36] то есть это ограничение нужно для того чтобы кто попало не мог отправить кому попало сообщение а схема работы следующая а если вспомнить самую 1 нашу схему то а вот этот сервер это будет


Step 4 (S-44899) 8.png

[13:36 - 13:51] гинкас просмотр уж а вот с удара локейшен а локейшен listen listen подключаются клиенты


[13:51 - 14:08] а вот сюда колокейшн publish наш сервер будет отправлять сообщение а вот так а у нас


[14:08 - 14:23] появился дополнительный а консервов итак по столкнулся с на вилле соответствующим образом его настроили нам остается только писать логику а отправки сообщения через сервер


Step 4 (S-44899) 9.png

Step 4 (S-44899) 10.png

[14:23 - 14:39] это делается вполне легко с помощью языка python а смотреть она засесть юшка которая отправляет сообщения а что мы делаем мы получаем из


[14:39 - 14:55] в данном случае с get параметр хотя правильнее было бы post использовалась я извиняюсь а мы получаем а кому отправлять то есть идентификаторы каналов которые отправлять


[14:55 - 15:14] а текст сообщения а вот по поводу сантиметров каналов это полностью на отвез на ответственности веб разработчика то есть вы как разработчик приложения должны сами определить а так чтобы ваши клиенты знали а номер канала


[15:14 - 15:32] например когда он заходит на страничку с чатом он этой страничке должен будет выведен номер номер канала для текущего учета чтобы все клиенты знали в каком чате не находится а окей мы получили текст и номер


[15:32 - 15:47] канала а дальше формируем по которому мы будем записывать то есть локейшен publish у нас используется мы используем 127 0 0 1 хост то есть мы


[15:47 - 16:02] пытаемся сделать запрос а к серверу который находится на нашем нашей 600 машин а тело сообщения мы сформируем с помощью модуля джисон


[16:02 - 16:17] то есть вот у нас есть некоторое структура мяса и состоит из массива с текстом формат сообщений тоже полностью на а ответственности


[16:17 - 16:36] а веб разработчика то есть технология позволяет вам передавать в принципе любые данные хоть плане текст а здесь вы должны договориться с фронтэнд разработчикам о том в каком виде будут приходить а данные от


[16:36 - 16:54] ну я предлагаю использовать не более простой и удобный способ мы получили новый запрос запрос делается с помощью библиотеки


[16:54 - 17:09] вот создается а создается объект запроса с помощью функции world open он отправляется мы получаем из помц если респонса успешной то есть


[17:09 - 17:26] сервер ответил нам 200 а повторюсь что мой от а вот эта наш аппликейшен сервер публикует то есть он обращается к локейшена publish для отправки сообщения если он нам ответил 200 то мы возвращаем клиентом


[17:26 - 17:41] а тоже успешное сообщение если произошла ошибка но мы каким то образом формируем отправляем ошибку а в чем здесь нюанс то есть сведут обложка ничего полезного не делать


[17:41 - 18:01] да это так но на практике здесь наверняка будет проверка прав доступа здесь наверняка это сообщение помимо комета будет записано еще в базу данных наверняка оно будет очищена проверенно а будет определено кому отправлять то есть вишня появится


[18:01 - 18:20] дополнительные вызовы а в чем здесь важный момент архитектурной вызов а вот этот вызов отправка в консервах он может быть долгим а это исключительно из за архитектуры конкретного модуля mod


[18:20 - 18:37] на практике для того чтобы ну что значит должен это знать что тот кто вызвал дамы так же будет ждать то есть клиент который а из браузера вызывает то в девушка ждет пока вьюшка обратиться коми сервера а


[18:37 - 18:55] сервер ждет пока сообщение будет доставлено до адресата а на практике а где то на пути между вот этой девушкой и сервером вставляют очередь то есть обмениваться данными не напрямую а через очередь это позволяет


[18:55 - 19:11] данный вид отвечать быстро вот уже такой архитектурный момент в некоторых серверах очередь встроена внутрь сервера такое тоже возможно а вот общем то все по поводу реализации


[19:11 - 19:30] сервера а теперь давайте посмотрим на плюсы минусы технологии в целом а нам сказать что технология коммент сейчас используется довольно активно а по крайней мере от популярной социальной сети работаю с помощью нее именно в контакте мир


Step 4 (S-44899) 11.png

[19:30 - 19:46] контакте мир точно использовать для доставки сообщений а работоспособность технологии а в чем ее +


[19:46 - 20:04] + поддержка всеми браузерами то есть с точки зрения браузера комменты это просто аякс запрос который должен выполнять ну естественно что аякс запросы на сегодняшний день мне делать практически все браузер а в силу того что используется и в конце вечера


[20:04 - 20:22] поддержка большого количества пользователей то есть в отличие от полинг а сервер может вполне обслуживает там 100 200 300000 пользователей одновременно и относительная простота реализации то есть мы видим что


[20:22 - 20:41] схема конечно получается сложнее чем с полем сервером но тем не менее есть уже готовые решения push и относительно простая то есть это вменяемая реализаций какие есть недостатки у кометы


[20:41 - 21:00] основной недостаток это все таки избыточность и запроса то есть раз в минуту 2 минуты каждый пользователь все таки делаем 1 http запрос а запрос конечно легко и просто но когда пользователи очень много а эти запросы создают


[21:00 - 21:19] нагрузку нагрузку на сервер чтобы распарсить степи нагрузку на сеть а передача данных то есть тебе запросам сотке относительно большой может быть там может быть много разных кук а в общем чувствуется некоторая избыточность механизма


[21:19 - 21:36] и а кроме того технология полудуплексная то есть а с помощью кометы можно только получать сообщения а иногда требуется еще отправлять нас для отправки используется обычно запрос а вот


[21:36 - 21:45] что казалось он подчеркнул что на сегодняшний день это 1 из основных технологий для реалтайм сообщений