SlideShare a Scribd company logo
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

More Related Content

PDF
08 - Web-технологии. Архитектура frontend-backend
PDF
07 - Web-технологии. Web-сервера
PDF
05 - Web-технологии. Сетевые протоколы
PDF
02 - Web-технологии. Web-клиенты
PDF
15 - Web-технологии. Сессии и авторизация
PDF
06 - Web-технологии. Протокол HTTP
PDF
01 - Web-технологии. Архитектура Web приложений
PDF
09 - Web-технологии. MVC фреймворки
08 - Web-технологии. Архитектура frontend-backend
07 - Web-технологии. Web-сервера
05 - Web-технологии. Сетевые протоколы
02 - Web-технологии. Web-клиенты
15 - Web-технологии. Сессии и авторизация
06 - Web-технологии. Протокол HTTP
01 - Web-технологии. Архитектура Web приложений
09 - Web-технологии. MVC фреймворки

What's hot (20)

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

Viewers also liked (20)

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

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

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

More from Roman Brovko (20)

PDF
Individual task Networking
PPTX
Networking essentials lect3
PPTX
Gl embedded starterkit_ethernet
PPTX
Networking essentials lect2
PPTX
Networking essentials lect1
PPTX
Bare metal training_07_spi_flash
PPTX
Bare metal training_06_I2C
PPTX
Glesk worshop
PPTX
Bare metal training_05_uart
PPTX
Bare metal training_04_adc_temp_sensor
PPTX
Bare metal training_03_timers_pwm
PPTX
Bare metal training_02_le_ds_and_buttons
PPTX
Bare metal training_01_hello_world
PPTX
Bare metal training_00_prerequisites
PPTX
C language lect_23_advanced
PPTX
C language lect_22_advanced
PPTX
C language lect_21_advanced
PPTX
подготовка рабочего окружения
PPTX
C language lect_20_advanced
PPTX
C language lect_19_basics
Individual task Networking
Networking essentials lect3
Gl embedded starterkit_ethernet
Networking essentials lect2
Networking essentials lect1
Bare metal training_07_spi_flash
Bare metal training_06_I2C
Glesk worshop
Bare metal training_05_uart
Bare metal training_04_adc_temp_sensor
Bare metal training_03_timers_pwm
Bare metal training_02_le_ds_and_buttons
Bare metal training_01_hello_world
Bare metal training_00_prerequisites
C language lect_23_advanced
C language lect_22_advanced
C language lect_21_advanced
подготовка рабочего окружения
C language lect_20_advanced
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