3. Чем занят backend?
T
- CPU - I/O
Compress
1K
bytes
with
Zippy
3,000
ns
Round
trip
within
same
datacenter
500,000
ns
h,ps://gist.github.com/jboner/2841832
11. Блокирующийся ввод-вывод
• accept(fd) - заблокируется, пока не будет нового
входящего соединения
• read(fd, buf) - заблокируется, пока не прибудут
данные в сокет
• write(fd, buf) - заблокируется, пока не освободится
место в буфере TCP
12. Неблокирующийся ввод-вывод
• Любая операция завершается немедленно
• Вместо того, чтобы заблокироваться, вызов
возвращает EAGAIN/EWOULDBLOCK
19. Нити (ОС)
• Видны планировщику
• Имеют отдельный стек и TLS
• Более легковесные, чем процесс
• Отсутствует изоляция
• Сложность написания корректных программ
20. Синхронизация
• Любой доступ к общим данным должен быть
синхронизирован
• Атомарные операции (без синхронизации)
• GIL
22. Кооперативная многозадачность
• “Невидима” для ОС, один процесс (нить)
• “Поток” добровольно передает управление другому
(проще синхронизация)
• Явная: callbackи
• Неявная: green threads ↺
23. Реактор
• “Дай мне кучу сокетов, а я сделаю callback, когда они
будут готовы”
• Таймер: “Вызови меня через X мс”
24. Что внутри
• Отсортированный по времени срабатывания список
таймеров + callback
• Список файловых дескрипторов для ожидания
готовности + callback
• select(fds, min(timer)) ⇛ callbacks
29. Драйвер “БД”
• База данных
• Очередь
• K-V хранилище
• Другой сервис
• …
30.
31. Соединение
• Соединение:
• на один запрос
TCP Connect Auth Send query Wait Result Disconnect
• постоянное
Send query Wait Result Send query Wait Result
32. Pipelining
• Pipelining запросов
Send query Wait Result Send query Wait Result
Send query Result Send query Result