19
Протоколы уровня приложения в браузере Илья Кутуков, Parallels

Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

  • Upload
    ontico

  • View
    213

  • Download
    2

Embed Size (px)

DESCRIPTION

Доклад Ильи Кутукова на HighLoad++ 2014.

Citation preview

Page 1: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Протоколы уровня приложения в браузереИлья Кутуков, Parallels

Page 2: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Задача• Передавать видео графической сессии пользователя

компьютера в браузер

• Передавать пользовательский ввод из браузера на удаленный компьютер

• Делать это с минимальной задержкой и потерями

• Обеспечить нативную поддержку в большинстве браузеров, включая IE и Safari

• Обеспечить высокий уровень безопасности. И возможность сделать его еще выше.

Page 3: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Что мы хотели сделатьКодирование/декодирование

Transports abstraction layer

Транспортный уровень браузера

Транспортный уровень хоста

Transports abstraction layer

Кодирование/декодирование

Облачная инфраструктура

Page 4: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

VS

Page 5: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Создатели браузеров• Не хотят, чтобы браузер стал DDoS платформой• Не хотят напстер в браузере• Безопасность ставится выше нужд разработчика

• Транспортный уровень всегда имеет обертку, существенно сужающую возможности

Page 6: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Транспорт: есть ли выбор?HTTP 1.X (TCP), SSE, AJAX

text based, request-response, heavy headers, asymmetric, no duplex, no multiplex, gzip from a box, 100% impact

WebSocket (TCP)binary/text, duplex, reliable, ordered, server push, ~80% impact, no

compression out of the box. Multiplexing and compression extensions approaching

WebRTC (TCP, UDP, STCP) DataChannelsbinary, ordered/unordered, reliable/unreliable, duplex, multiplex,

multihoming, server push, no compression, ~50% impact

Page 7: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Все сложно

Page 8: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

TCPГарантированная доставкав гарантированном порядке

Большой блок данныхВажный блок данных

Обратная сторона – HOL блокировка

Большой блок данных

Важный блок данныхХочется

так:

Page 9: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Time Division MultiplexingИспользуется несколько подключений

Обычные браузеры ~ 6 каналов на хостМобильные браузеры – 2 канала на хост

Большой блок данных

Важный блок данных

Page 10: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Transport abstraction layer

Slim FatFat

Big message

Small message

Connections pool

Route layer

Fat queue/bufferSlim queue/buffer

Page 11: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

РеконнектыБез heartbeat на уровне приложения невозможно быстро определить смерть сокета

Мы используем две политики восстановления, session reset и freeze/replay

Page 12: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Freeze/replay

Запомнить ID последнего полученного сообщенияБлокировать действия пользователяОткатить очередь посланных сообщений (!)Остановить таймеры в бизнес-логике

Послать серверу запомненный IDПолучить и обработать все накопленные сообщенияВернуть таймеры и действия пользователя

Транспорт сломался Транспорт восстановился

Page 13: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Варианты из коробки

SockJSfamily

Primus.IO

Engine.IOSocket.IO>=1.0

Socket.IO<1.0

Autobahn.wsfamily

Page 14: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

СообщенияID 1020

StartStreamFrom chunk 3

ID 1020Chunk 3

ID 1020Chunk 4

ID 1020Chunk 5

Seq 1021GiveX

Seq 1021HereIsX

RPC

Заказ потока

Page 15: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Кодирование• Не стоит без необходимости передавать схему

данных вместе с данными• IDL позволяет унифицировать схемы• Существующие serialization frameworks

представляют готовое решение из коробки

Page 16: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Выбор Serialization frameworkProtoBuf Thrift AvroОсобенности дизайна Data-oriented Service-oriented Flexible schemas

Стабильная и быстрая имплементация под JS

Потребовалась незначительная доработка

- -

Объем кодогенерации (вероятность багов в ней)

Низкий Средний/высокий

Высокий

Размер сообщений на тестовых последовательностях ~

1.1x 1.1x 1.0x

Возможность текстовой сериализации

- + +

Page 17: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Мы используем Protocol Buffers• Имплементация клиентской стороны - от

DcodeIO, серверной - от Google• На практике получилась высокая

производительность кодирования и декодирования

• Отладка бинарного протокола была мучительной

• Схема строится из родительских Request/Reply сообщений и наборов extensions

Page 18: Протоколы уровня приложения в браузере, Илья Кутуков (Parallels)

Тюнинг• Многопоточное кодирование/декодирование

посредством WebWorkers• Per-message компрессия• Префетч и индексация фрагментов сообщений• TCP Warm-up