Задача
• Есть два типа сервиса
• Между ними необходимо гонять большое число параллельных потоковых данных
• Задачу надо решать
• Много боли
UDP
• Легкий и простой
• Отсутствует понятие соединения
• Нет контроля доставки
• Нет контроля скорости передачи
UDPЛегкий и простой
Отсутствует понятие соединения Нет контроля доставки
Нет контроля скорости передачи
1 2 3 4 5 6
2 3 1 5 6 4
Sender
Receiver
TCP
• Легкий и простой в использовании. Очень сложный в реализации.
• Требует установления соединения
• Гарантирует порядок передачи данных
• Управляет скоростью передачи
TCPЛегкий и простой в использовании. Очень сложный в реализации.
Требует установления соединения Гарантирует порядок передачи данных
Управляет скоростью передачи
1 2 3 4 5 6
2 3 1 5 6 4
Retransmit
1 2 3 4 5 6
Sender
Receiver
Buffer
TCP алгоритмы
• Размер буфера отправки/получения
• Время ожидания доставки пакета
• Частота отправки пакетов
TCP multiplexing
• Решаем проблему ограниченности портов
• Решаем проблему “разгона” новых соединений
TCP multiplexing
• Решаем проблему ограниченности портов
• Решаем проблему “разгона” новых соединений
• Но есть один нюанс
Современные протоколы
• Современный мир стал гораздо более интерактивным, чем раньше
• HTTP2, решение для потоков данных client\server
• QUIC, решение для потоков данных client\server, server\server
HTTP2
• Работает поверх TCP
• Решает проблему одновременных запросов клиента к серверу
• Практически не улучшает ситуацию с HOLB
• Не подходит для server\server взаимодействия
QUIC• Анонсирован в 2013, после окончания работ над
HTTP2
• Работает поверх UDP
• Фактически этот протокол можно назвать “TCP с независимыми подканалами”
• Решает все проблемы. Но сырой, сложный для имплементации, нет реализаций, кроме референсной на C/C++
Что можно упростить• Все современные протоколы - общего пользования. То есть рассчитаны на работу в условиях сомнительного качества интернет канала.
• Внутри одного ДЦ сеть работает отлично.
• Значит можно делать кастомное решение поверх TCP (снимая с себя огромный кусок сложности)
Astranet1 2 3 4 5 6 7 8 9 10 11 12
Worker1
Врем
я
I’m ready
1 2
I’m ready
3 4
Worker2
I’m ready
2
I’m ready
4
Worker3
I’m ready
2
I’m ready
4
1
3
I’m stuck
1
3Still stuck
Astranet• Service discovery
• Sticky load-balancing
• Возможность запускать сервер за натом
• Простой (нативный для потоков) API
• Линейная производительность 50% от производительности чистого tcp стека
Ваши вопросы• Ilya Biin
• skype: biinilya
• Полезные ссылки:
• https://github.com/zenhotels/astranet
• https://en.wikipedia.org/wiki/QUIC
• https://en.wikipedia.org/wiki/HTTP/2
• https://en.wikipedia.org/wiki/Head-of-line_blocking
Обо мне