Step 3 (S-44898)

From Stepik Wiki
Jump to: navigation, search

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

Step 3 (S-44898) 1.png

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


Step 3 (S-44898) 2.png

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


[00:35 - 00:54] проверить наличие новых сообщений web server смотрят например по базе данных не появилось ли новых сообщений и возвращается а пользователя если сообщение не пришло например можно вернуть код ответа 204


[00:54 - 01:11] они даже придумали 204 no content то есть ответ успешной но данных никаких нет а веб клиент получает ответ ждет 5 секунд и повторяет запрос


[01:11 - 01:30] если в какой то момент времени на сервере появляется сообщение а для клиента то при последующем запросе о нем узнает и вернет это сообщение с кодом 200 клиент получит


[01:30 - 01:48] давайте посмотрим как такой подход можно реализовать клиенте на сервере начнем с клиентом а здесь мы видим а код на языке javascript а вообще ничего не говорили поэтами


Step 3 (S-44898) 3.png

[01:48 - 02:05] я постараюсь объяснить подробнее во 1 а начнем вот с этого вызова интервал это вызов а функция интервал передается 2 аргумента 1 это некоторая функция


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


[02:21 - 02:39] соответственно указано число миллисекунд а то есть в нашем случае тот код который находится внутри функции будут выполняться раз 5 секунд до тех пор пока пользователь не закроют страничку


[02:39 - 02:55] а что делает этот код здесь код с использованием библиотеки jquery если вспомнить что мы говорили про а про аякс запросы то этот кот делает запрос а она


[02:55 - 03:11] вот этот указанных мест то есть запрос на получение сообщений при этом передаются параметры запроса некоторые channel войди и некоторые параметр since а что это за параметры


[03:11 - 03:27] начнем а практически во всех системах реалтайма при подключении клиент а должен указать какой канал слушать что такое канал каналы то нет


[03:27 - 03:42] некоторые очередь first in first out сообщениями а на сервере может находиться несколько каналов например несколько разных несколько разных чатов


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


[03:59 - 04:17] в нашем случае номер канала это просто число а из этого есть следствие что канала нас фактически публичной то есть они не обеспечивают защиту а совместно через а такой способ доставки нельзя передавать


[04:17 - 04:32] а например личные сообщения потому что кто угодно может подобрать номер канала прочитать чужие сообщения как вариант вместо указания channel а сервер может ориентироваться на авторизационные куки


[04:32 - 04:50] то есть на сессию пользователя а в таком случае мы получим разделение по частным сообщение и так то есть чем ладьи это некоторое число которое показывает и с какой комнаты и с какой с какой очереди мы хотим получать сообщения


[04:50 - 05:08] а зависит от типа приложение которое мы используем если точат и то это номер комнаты если у нас а личные сообщения то место где будет использоваться а люди какой то секретный токен либо просто в традиционности


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


[05:23 - 05:42] а свойства мест ужас если этого свойства нет либо если это массив нулевой длины то мы просто выходим и э на этой трассе и ничего не делаю однако если это свойство есть то очевидно что там сообщение


[05:42 - 06:00] некоторые функции message здесь все зависит от бизнес логики то есть возможность написать это сообщение показать пользователю то что вот и теперь параметр since что такое зачем нужен параметр since а


[06:00 - 06:16] параметры since указывается а то идентификатор сообщения которые мы уже получили а представьте что у нас так во времени вер вот тут находится сообщение


[06:16 - 06:35] это момента возникновения сообщение допустим а вот в этот момент произошло обращение пользователя сервер ему вернул вот это сообщение следующее обращение а


[06:35 - 06:52] сервер должен знать какие сообщение пользователю вернуть то есть я даже лучше не так нарисую нарисую что сложнее было что следующее обращение произошло вот здесь а какие а сообщение нужно вернуть пользователя то есть


[06:52 - 07:09] 1 предыдущее 2 предыдущих или 3 предыдущих то сервер должен знать какие сообщения пользователь уже получил для этого используется параметр since то есть в параметре since фактически продается а идентификатор начиная с такого сообщения нужно получать


[07:09 - 07:27] вот общем то вся логика давайте еще раз повторим вызов с это интервал просто позволяет запускать там некоторые код каждые 5 секунд 5 игроков заключается в том что выполняется запрос на определенный угол


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


Step 3 (S-44898) 4.png

[07:43 - 07:58] сервера запросы отправлять запросы в принципе обычно запрос то есть у нас есть некоторое в юшка в нашем случае а юшка при обращении что делает извлекает параметры


[07:58 - 08:13] идентификатор канала и а параметр since и делает запрос к таблице сообщение мы предполагаем что нас сообщение все хранятся скажем в 1 таблице


[08:13 - 08:29] ну это условность фильтрация по нужному каналом и фильтрация что идентификатор сообщения больше чем параметр since а сортировка соответственно пользованию идентификатор


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


[08:49 - 09:06] сначала более старые каком угодно а смотрите в нашем случае это а какой reset нам нужно получить конкретные данные что мы делаем мы пишу вот такую конструкцию а


[09:06 - 09:23] что эта конструкция означает нетривиально немножко она создает новый массив который состоит из элементов элементов такого вида то есть мы берем каждое сообщение из


[09:23 - 09:39] из исходного кода то есть проходимся покоя рецепту а это вызовет запрос в базу данных и для каждого сообщения до каждого объекта модель а модель а для каждого


[09:39 - 09:54] мы заменяем его на вызов некоторые функции но предполагается что в модели у нас есть функция которая образует модель в какой то там представление подходящие для джисон после чего мы отдаем


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


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


Step 3 (S-44898) 1.png

[10:26 - 10:41] во 1 это простота и надежность реализации а мы не использовали никаких новых технологий уже имеющиеся наверняка на с в нашем приложении javascript и а просто добавили еще 1 вьюшку


[10:41 - 10:59] поэтому реализовать можно буквально за несколько минут не требуется никакого дополнительного программного обеспечения то есть мы используем наши прикидывал сервер us + django и все а


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


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


[11:35 - 11:52] что а существенно хуже с технической точки зрения это избыточное количество запросов а дело в том что каждый клиент фактически постоянно нагружает ваш сервер если у вас а ну есть такой параметр отцу


[11:52 - 12:11] если вашим приложением пользуется одновременно допустим 20000 пользователей ну или 5 там 10000 пользователей отец тысяч пользователей а это в принципе такого среднего размера небольшое а


[12:11 - 12:29] небольшой сайт то есть средненькая приложение а и допустим каждый пользователь будет загружать а делать запрос раз 5 секунд соответственно делим 10000x5 получаем а 2000


[12:29 - 12:48] запросов в секунду будут исключительно на проверку сообщений причем что скорее всего пользователи не будут отправлять такой большой объем сообщения большинство запросов будет входить в пустую а в принципе наш обработчик наша вьюшка она довольна


[12:48 - 13:04] то есть она не делать таких сложных вычислений запрос баз наверняка тоже относительно простой но 2000 запросов то есть для такой аудитории 1000 запросов от много а


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


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


[13:39 - 13:54] вряд ли большое количество людей смотрят одновременно эту страницу то есть э ну как раз те самые могут 10 10 1000 быть присутствовал при большой аудитории всего сайта на 1 странице сидит немножко людей и а


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