Slide 1

Slide 1 text

Надёжные вебсокеты Андрей Новиков, Evil Martians Summer SaintP RubyConf 2017

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

● https://youtu.be/OXjNsLQPQUc ● https://www.slideshare.net/it-people/realtime-evil-martians

Slide 7

Slide 7 text

Проблемы 1. Подключение разорвано сервером, но не нами (мы думаем, что мы до сих пор подключены) ↑ ActionCable решает эту проблему 2. Мы не получаем сообщения, когда мы отключены ↑ ActionCable не решает эту проблему (т. к. Redis PubSub)

Slide 8

Slide 8 text

Методы обхода проблемы ● Отслеживание id последнего сообщения ● Сдаться и перезагрузить всё заново

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Что, если этого недостаточно? ● Если неприемлемо перезагружать приложение ● То остаётся недоставленные сообщения копить, выстраивая их в, например, очередь… ● Очередь!!!1

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

P P X X C C C Server (a.k.a. Broker) Clients Clients Applications Produce Messages Exchanges Route and Filter Messages Queues Store and Forward Messages Applications Consume Messages

Slide 13

Slide 13 text

P X X C C Server (a.k.a. Broker) Clients Application Backend produce Messages Exchanges Route and Filter Messages Queues Store and Forward Messages Frontend Consume Messages AMQP STOMP over WS

Slide 14

Slide 14 text

AMQP ● Самый распространённый протокол для общения с очень многими OpenSource-брокерами: ActiveMQ, RabbitMQ, … ● Есть надёжные и обкатанные библиотеки для него

Slide 15

Slide 15 text

STOMP ● Простой текстовый протокол для MQ, похожий на HTTP ● Легко читать, легко дебажить ● Работает поверх Websockets ● Модель отличается от AMQP MESSAGE subscription:794a43a6-2821-4bc8 destination:/exchange/ticks/ticks message-id:T_794a43a6-2821-4bc8 ack:T_794a43a6-2821-4bc8 content-type:application/octet-stream content-length:95 {"id":"3cc50681-77f1-4fe1-b0d2- 3f115b54e54a","content":"Usual message at 2017-08-19T08:15:43Z"} SUBSCRIBE ack:client-individual durable:true auto-delete:false x-expires:86400000 id:794a43a6-2821-4bc8 destination:/exchange/ticks/ticks

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Почему RabbitMQ? ● Проверен временем ● Популярный ● Умеет в вебсокеты (WebSTOMP, а теперь ещё и WebMQTT) ● Умеет в гарантированную доставку ● Есть рабочие клиентские библиотеки для Ruby и JS ● Open Source!

Slide 19

Slide 19 text

Откуда надёжность? ● Persistent messages ● Durable exchanges ● Каждой вкладке браузера — по надёжной очереди ● Подтверждение получения каждого сообщения

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Бэкенд! https://github.com/Envek/durable-websockets

Slide 22

Slide 22 text

Фронтенд! ● https://github.com/JSteunou/webstomp-client ● «Оборачивает» собой нативный WebSocket или SockJS

Slide 23

Slide 23 text

Фронтенд! ● https://github.com/JSteunou/webstomp-client ● Можно подписываться на exchange или на очередь

Slide 24

Slide 24 text

Фронтенд! ● https://github.com/JSteunou/webstomp-client ● Нужно передать пачку тщательно подобранных опций…

Slide 25

Slide 25 text

Посмотрим в действии? https://github.com/Envek/durable-websockets/tree/example

Slide 26

Slide 26 text

MQTT?

Slide 27

Slide 27 text

Is it web-scale? http://underthehood.meltwater.com/blog/2016/09/01/rabbitmq-performance/ ● Можно прокачивать десятки тысяч сообщений в секунду на среднем сервере ● RabbitMQ очень охоч до RAM (≈1 ГБ на 2500 очередей)

Slide 28

Slide 28 text

Как снаряжать в бой ● Настройку exchange’й лучше держать в Puppet/Ansible/… ● Спрячьте WebSTOMP-endpoint за Nginx (+auth_request) ● Настройте политику expires для автоудаления очередей ● Очередям дайте уникальное имя (каждой вкладке по UUID с префиксом, в браузере надо уметь его увидеть) ● Мониторьте количество unacked-сообщений (их быть не должно — верный признак ошибки на фронте)

Slide 29

Slide 29 text

Что дальше? ● http://rubybunny.info/articles/durability.html ● https://www.rabbitmq.com/stomp.html ● http://www.rabbitmq.com/web-stomp.html ● http://jmesnil.net/stomp-websocket/doc/

Slide 30

Slide 30 text

Вопросы? facebook.com/Envek envek@envek.name А твиттер — зло.