SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
Real Time
сообщения
Примеры использования
•   Чаты и мессенджеры
•   Отображение котировок
•   Прямые трансляции (a-la twitter)
•   Push уведомления
•   Сетевой обмен в играх на HTML
2
Архитектура
 
3
Решения
•   Polling - периодический опрос сервера
•   Comet (Long polling) - polling с долгоживущими запросами
•   Server Push - бесконечный запрос
•   WebSocket - специализированный протокол
4
Polling
Polling - периодический опрос
6
Polling на клиенте
var since = 0;
setInterval(function() {
$.ajax({
type: 'GET',
url: '/get_messages/',
data: { channel_id: 5, since: since },
}).success(function(resp) {
if (!resp.messages || !resp.messages.length) {
return;
}
handleMessages(resp.messages);
since = resp.messages[0].id;
});
}, 5000);
7
Polling на сервере
def get_messages(request):
chan_id = request.GET.get('channel_id')
since = request.GET.get('since', 0)
messages = Messages.filter(
channel_id = channel_id,
id__gt = since,
).order_by('-id')
messages = [ m.as_data() for m in messages ]
return HttpResponseAjax(messages = messages)
8
Плюсы и минусы Polling
➕ Простота и надежность реализации
➕ Не требуется дополнительного ПО
➖ Сообщения приходят с задержкой до N секунд
➖ Избыточное число HTTP запросов RPS=CCU/N
➖ Ограничение по числу пользователей
9
Comet
Comet - долгоживущие запросы
11
Comet на клиенте
function getComet() {
$.ajax({
type: 'GET',
url: '/get_messages/',
data: { channel_id: 5 },
}).success(function(resp) {
handleMessages(resp.messages);
getComet();
}).error(function() {
setTimeout(getComet, 10000);
});
}
getComet();
12
Comet на сервере
В технологии comet сервер должен поддерживать одновременно
открытыми большое количество соединений, причем каждое
соединение находится в ожидании сообщений для него. По этой
причине мы не можем использовать классический application-
сервер в роли comet-сервера. Для comet-сервера необходима
отдельная технология, например nginx + mod_push.
13
Nginx + mod_push
location /publish/ {
set $push_channel_id $arg_cid; # id канала
push_store_messages off; # не храним сообщения
push_publisher; # включаем отправку
allow 127.0.0.1;
deny all;
}
location /listen/ {
push_subscriber_concurrency broadcast; # всем!
set $push_channel_id $arg_cid; # id канала
default_type application/json; # MIME тип сообщения
push_subscriber; # включаем доставку
}
14
Плюсы и минусы Comet
➕ Поддержка всеми браузерами
➕ Поддержка большого числа пользователей
➕ Относительная простота реализации
➖ Избыточные HTTP запросы
➖ Half-duplex
15
Server push
Server push - бесконечный запрос
17
Server push на клиенте
<script>
function handle(message) {
// любая логика
}
</script>
<iframe src='/messages/?cid=123'></iframe>
Ответ сервера:
<script>parent.handle({ message: 'hello' })</script>
18
WebSocket
WebSocket
20
WebSocket handshake
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
21
WebSocket на стороне клиента
var socket = new WebSocket('ws://host/echo');
socket.onopen = function(event) {
console.log('ws opened');
var data = JSON.stringify({ message: "Hello WebSocket" });
socket.send(data);
};
socket.onmessage = function(event) {
var resp = JSON.parse(event.data);
console.log('ws message', resp.message);
};
socket.onclose = function(event) {
console.log('ws closed')
};
22
WebSocket на стороне сервера
registry = {}
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
self.uid = self.get_argument("uid")
registry[self.uid] = self
def check_origin(self, origin):
return True
def on_close(self):
del registry[self.uid]
23
WebSocket на стороне сервера (2)
class MainHandler(tornado.web.RequestHandler):
def post(self):
body = self.get_argument("msg")
uid = self.get_argument("uid")
conn = registry.get(uid)
if conn:
conn.write_message(body)
self.write("OK")
else:
self.write("NO")
24
WebSocket на стороне сервера (3)
if __name__ == "__main__":
app = tornado.web.Application([
(r"/pub", MainHandler),
(r"/sub", WSHandler),
])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
25
Плюсы и минусы WebSocket
➕ Минимальный объем трафика
➕ Минимальная нагрузка на сервер
➕ Поддержка большого числа пользователей
➕ Full-duplex
➖ Нет поддержки IE<10, OperaMini, Android<4.4
➖ Требуется специальный WebSocket-сервер
➖ Плохо работает с прокси-серверами
26
Отправка
сообщений
Отправка сообщений
import requests # pip install requests
import json
puburl = 'http://127.0.0.1/publish/'
def send_message(request):
cid = request.GET.get('to')
text = request.GET.get('text')
body = json.dumps({ 'messages': [ text ] })
try: ## может быть долгим
resp = requests.post(puburl, params={'cid':cid}, data=body)
if resp.status_code == 200:
return HttpResponseAjax()
else:
return HttpResponseAjaxError(code=resp.status_code)
except:
return HttpResponseAjaxError(code=500)
28
Отправка через очередь
29

Weitere ähnliche Inhalte

Was ist angesagt?

2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussiaNikolay Samokhvalov
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ruNikolay Samokhvalov
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_rumcroitor
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_rumcroitor
 
WebSockets
WebSocketsWebSockets
WebSocketsplusnin
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.Alexander Frolov
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиKirill Mokevnin
 
03 web server_architecture_ru
03 web server_architecture_ru03 web server_architecture_ru
03 web server_architecture_rumcroitor
 
06 php instalation_ru
06 php instalation_ru06 php instalation_ru
06 php instalation_rumcroitor
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor SysoevMedia Gorod
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_rumcroitor
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....KazHackStan
 

Was ist angesagt? (20)

WWW
WWWWWW
WWW
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
HTTP протокол
HTTP протоколHTTP протокол
HTTP протокол
 
Major mistakes in site moving
Major mistakes in site movingMajor mistakes in site moving
Major mistakes in site moving
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_ru
 
WebSockets
WebSocketsWebSockets
WebSockets
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статики
 
03 web server_architecture_ru
03 web server_architecture_ru03 web server_architecture_ru
03 web server_architecture_ru
 
06 php instalation_ru
06 php instalation_ru06 php instalation_ru
06 php instalation_ru
 
Chef
ChefChef
Chef
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
 
Сокеты
СокетыСокеты
Сокеты
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)
 

Andere mochten auch

16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAXRoman Brovko
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка формRoman Brovko
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django моделиRoman Brovko
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБДRoman Brovko
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентовRoman Brovko
 
13 - Web-технологии. Отображение данных
13 - Web-технологии. Отображение данных13 - Web-технологии. Отображение данных
13 - Web-технологии. Отображение данныхRoman Brovko
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSFRoman Brovko
 
01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPARoman Brovko
 
03-Hibernate. Документация
03-Hibernate. Документация03-Hibernate. Документация
03-Hibernate. ДокументацияRoman Brovko
 
04-Hibernate. Создание проекта
04-Hibernate. Создание проекта04-Hibernate. Создание проекта
04-Hibernate. Создание проектаRoman Brovko
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 
02-Hibernate. Hibernate
02-Hibernate. Hibernate02-Hibernate. Hibernate
02-Hibernate. HibernateRoman Brovko
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOSRoman Brovko
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требованияRoman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка XcodeRoman Brovko
 
137 - Spring. ResourceBundle
137 - Spring. ResourceBundle137 - Spring. ResourceBundle
137 - Spring. ResourceBundleRoman Brovko
 
134 - Spring. Области видимости данных
134 - Spring. Области видимости данных134 - Spring. Области видимости данных
134 - Spring. Области видимости данныхRoman Brovko
 
13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработкеRoman Brovko
 

Andere mochten auch (20)

16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django модели
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
13 - Web-технологии. Отображение данных
13 - Web-технологии. Отображение данных13 - Web-технологии. Отображение данных
13 - Web-технологии. Отображение данных
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSF
 
01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA01-Hibernate. Понятие ORM-JPA
01-Hibernate. Понятие ORM-JPA
 
03-Hibernate. Документация
03-Hibernate. Документация03-Hibernate. Документация
03-Hibernate. Документация
 
04-Hibernate. Создание проекта
04-Hibernate. Создание проекта04-Hibernate. Создание проекта
04-Hibernate. Создание проекта
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
02-Hibernate. Hibernate
02-Hibernate. Hibernate02-Hibernate. Hibernate
02-Hibernate. Hibernate
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
 
137 - Spring. ResourceBundle
137 - Spring. ResourceBundle137 - Spring. ResourceBundle
137 - Spring. ResourceBundle
 
134 - Spring. Области видимости данных
134 - Spring. Области видимости данных134 - Spring. Области видимости данных
134 - Spring. Области видимости данных
 
13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке
 

Ähnlich wie 17 - Web-технологии. Real Time сообщения

Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Михаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxМихаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxYandex
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxYandex
 
Web socket и приложения реального времени
Web socket и приложения реального времениWeb socket и приложения реального времени
Web socket и приложения реального времениOleksandr Voytsekhovskyy
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Socketsguest092df8
 
МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2Dima Dzuba
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Socketsrit2010
 
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложения
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложенияСтажировка-2015. Разработка. Занятие 3. Серверные Java-приложения
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложения7bits
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSYandex
 
Создание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterСоздание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterRostyslav Siryk
 
SignalR
SignalRSignalR
SignalRmstDe3
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéInterSystems CEE
 

Ähnlich wie 17 - Web-технологии. Real Time сообщения (20)

Periculum est in mora
Periculum est in moraPericulum est in mora
Periculum est in mora
 
Web лекция 1
Web   лекция 1Web   лекция 1
Web лекция 1
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Михаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajaxМихаил Давыдов: Транспорт, ajax
Михаил Давыдов: Транспорт, ajax
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
 
Web socket и приложения реального времени
Web socket и приложения реального времениWeb socket и приложения реального времени
Web socket и приложения реального времени
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2
 
Web sockets
Web socketsWeb sockets
Web sockets
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложения
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложенияСтажировка-2015. Разработка. Занятие 3. Серверные Java-приложения
Стажировка-2015. Разработка. Занятие 3. Серверные Java-приложения
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
176023
176023176023
176023
 
Создание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterСоздание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере Twitter
 
Fiddler
FiddlerFiddler
Fiddler
 
SignalR
SignalRSignalR
SignalR
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
 
Zacepin
ZacepinZacepin
Zacepin
 

Mehr von Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

Mehr von Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

17 - Web-технологии. Real Time сообщения

  • 2. Примеры использования •   Чаты и мессенджеры •   Отображение котировок •   Прямые трансляции (a-la twitter) •   Push уведомления •   Сетевой обмен в играх на HTML 2
  • 4. Решения •   Polling - периодический опрос сервера •   Comet (Long polling) - polling с долгоживущими запросами •   Server Push - бесконечный запрос •   WebSocket - специализированный протокол 4
  • 7. Polling на клиенте var since = 0; setInterval(function() { $.ajax({ type: 'GET', url: '/get_messages/', data: { channel_id: 5, since: since }, }).success(function(resp) { if (!resp.messages || !resp.messages.length) { return; } handleMessages(resp.messages); since = resp.messages[0].id; }); }, 5000); 7
  • 8. Polling на сервере def get_messages(request): chan_id = request.GET.get('channel_id') since = request.GET.get('since', 0) messages = Messages.filter( channel_id = channel_id, id__gt = since, ).order_by('-id') messages = [ m.as_data() for m in messages ] return HttpResponseAjax(messages = messages) 8
  • 9. Плюсы и минусы Polling ➕ Простота и надежность реализации ➕ Не требуется дополнительного ПО ➖ Сообщения приходят с задержкой до N секунд ➖ Избыточное число HTTP запросов RPS=CCU/N ➖ Ограничение по числу пользователей 9
  • 10. Comet
  • 11. Comet - долгоживущие запросы 11
  • 12. Comet на клиенте function getComet() { $.ajax({ type: 'GET', url: '/get_messages/', data: { channel_id: 5 }, }).success(function(resp) { handleMessages(resp.messages); getComet(); }).error(function() { setTimeout(getComet, 10000); }); } getComet(); 12
  • 13. Comet на сервере В технологии comet сервер должен поддерживать одновременно открытыми большое количество соединений, причем каждое соединение находится в ожидании сообщений для него. По этой причине мы не можем использовать классический application- сервер в роли comet-сервера. Для comet-сервера необходима отдельная технология, например nginx + mod_push. 13
  • 14. Nginx + mod_push location /publish/ { set $push_channel_id $arg_cid; # id канала push_store_messages off; # не храним сообщения push_publisher; # включаем отправку allow 127.0.0.1; deny all; } location /listen/ { push_subscriber_concurrency broadcast; # всем! set $push_channel_id $arg_cid; # id канала default_type application/json; # MIME тип сообщения push_subscriber; # включаем доставку } 14
  • 15. Плюсы и минусы Comet ➕ Поддержка всеми браузерами ➕ Поддержка большого числа пользователей ➕ Относительная простота реализации ➖ Избыточные HTTP запросы ➖ Half-duplex 15
  • 17. Server push - бесконечный запрос 17
  • 18. Server push на клиенте <script> function handle(message) { // любая логика } </script> <iframe src='/messages/?cid=123'></iframe> Ответ сервера: <script>parent.handle({ message: 'hello' })</script> 18
  • 21. WebSocket handshake GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat 21
  • 22. WebSocket на стороне клиента var socket = new WebSocket('ws://host/echo'); socket.onopen = function(event) { console.log('ws opened'); var data = JSON.stringify({ message: "Hello WebSocket" }); socket.send(data); }; socket.onmessage = function(event) { var resp = JSON.parse(event.data); console.log('ws message', resp.message); }; socket.onclose = function(event) { console.log('ws closed') }; 22
  • 23. WebSocket на стороне сервера registry = {} class WSHandler(tornado.websocket.WebSocketHandler): def open(self): self.uid = self.get_argument("uid") registry[self.uid] = self def check_origin(self, origin): return True def on_close(self): del registry[self.uid] 23
  • 24. WebSocket на стороне сервера (2) class MainHandler(tornado.web.RequestHandler): def post(self): body = self.get_argument("msg") uid = self.get_argument("uid") conn = registry.get(uid) if conn: conn.write_message(body) self.write("OK") else: self.write("NO") 24
  • 25. WebSocket на стороне сервера (3) if __name__ == "__main__": app = tornado.web.Application([ (r"/pub", MainHandler), (r"/sub", WSHandler), ]) app.listen(8888) tornado.ioloop.IOLoop.current().start() 25
  • 26. Плюсы и минусы WebSocket ➕ Минимальный объем трафика ➕ Минимальная нагрузка на сервер ➕ Поддержка большого числа пользователей ➕ Full-duplex ➖ Нет поддержки IE<10, OperaMini, Android<4.4 ➖ Требуется специальный WebSocket-сервер ➖ Плохо работает с прокси-серверами 26
  • 28. Отправка сообщений import requests # pip install requests import json puburl = 'http://127.0.0.1/publish/' def send_message(request): cid = request.GET.get('to') text = request.GET.get('text') body = json.dumps({ 'messages': [ text ] }) try: ## может быть долгим resp = requests.post(puburl, params={'cid':cid}, data=body) if resp.status_code == 200: return HttpResponseAjax() else: return HttpResponseAjaxError(code=resp.status_code) except: return HttpResponseAjaxError(code=500) 28