Highload для начинающих, Дмитрий Обухов (Mail.ru)

Post on 16-Jun-2015

964 views 0 download

description

Доклад Дмитрия Обухова на HighLoad++ 2014.

Transcript of Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoadдля начинающих

HighLoad для начинающих

Dmitry E. Oboukhov

31 октября 2014

HighLoad, что это?

I Конференция?

I Высокая нагрузка?I Миф?!

HighLoad, что это?

I Конференция?I Высокая нагрузка?

I Миф?!

HighLoad, что это?

I Конференция?I Высокая нагрузка?I Миф?!

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду?

- средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!

I 1 запрос в секунду? - любой веб сервер?...перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду?

- любой веб сервер?...перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Высокая нагрузка это:

Нагрузка, с которой не справляетсяжелезо

Высокая нагрузка это:

Нагрузка, с которой не справляетсяжелезо

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Когда это бывает?

Достигнуты технические ограничения

I Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Когда это бывает?

Достигнуты технические ограниченияI Сеть

- за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I Память

I CPUI Хранилище данных

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPU

I Хранилище данных

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Причины

I Недоиспользование железаI Трудности масштабирования

Причины

I Недоиспользование железа

I Трудности масштабирования

Причины

I Недоиспользование железаI Трудности масштабирования

Причины

Архитектурные проблемы

Недоиспользование железа

Рассмотрим типичный вебсервер.

на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl

, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python

, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby

...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.

I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.

I Валидация запроса, выборконтроллера.

I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.

I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.

I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).

I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один цикл

I один тред на один цикл

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.I Увеличение числа серверов.

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.

I Увеличение числа серверов.

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.I Увеличение числа серверов.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.

I Увеличили число процессов в работе.Помогло.

I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.

I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.

I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?

- Мы над этим 3 года работали!I Добавлять второй сервер?

- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?

- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!

I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.

I Провести измерения.I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.

I Найти слабые места.

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Недоиспользование железа

Измерения

Чтение запроса из сети. 15К RPSПарсинг запроса, валидация, выбор контроллера. 150К RPS/CPU

Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPU

Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!

I У нас проблемы на 150 RPS!I Тут что-то не так!

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!

I Тут что-то не так!

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.

неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?

I Проблемы стали больше!I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!

I Почему?!

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели

расчетные.

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.

I Этот код AS IS по результатам измерений может выдавать гораздобольше RPS чем в реальности.

I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.

I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели

расчетные.

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.

I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.

I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.

I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.

I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.

I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Недоиспользование железа

Измеряем

Ожидание запроса (данных) от пользователя. 70 мксПарсинг запроса, валидация. 6 мкс

Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мкс

Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мкс

Ожидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 =

17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мкс

I Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 =

156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мкс

I Код выполняется только 10% времени!I И при этом тормозит!

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!

I И при этом тормозит!

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Недоиспользование железа

#include <unistd.h>

int main(int argc, char **argv) {int i;for (;;) {

usleep(70); usleep(7);usleep(16); usleep(10);usleep(70);

}}

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU

- по моим измерениям - где-то 15% загрузки на CPUI Запустив десяток таких “воркеров”, получаем примерно такую же

нагрузку как на проблемном сервере.I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительность

достаточную для развития проекта еще на несколько лет вперед.I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.

I Что делать?

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Недоиспользование железа

Просто реорганизовать код

Событийно-ориентированное программирование

Компьютер — это конечный автомат. Треды для тех людей,которые не умеют программировать конечные автоматы.

Алан Кокс

Событийно-ориентированное программирование

Избавимся от тредов!

- и процессов.

Событийно-ориентированное программирование

Избавимся от тредов!- и процессов.

Событийно-ориентированное программирование

Машина событий

I Вся работа делается в обработчике события.- в общем случае - callback.

I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.

I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.

в общем случае - return из callback.I Обработчик события может генерировать другие события и

устанавливать другие обработчики.

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.

- заменится обработчиком события "пришел запрос от пользователя"I Парсинг запроса, валидация.

- не изменитсяI Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.

- не изменитсяI Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Событийно-ориентированное программирование

Итого

I Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.I Но слишком много переделок!

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 раз

I Одного CPU/коннекта к БД достаточно для еще нескольких лет ростанагрузки.

I Но слишком много переделок!

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.

I Но слишком много переделок!

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.I Но слишком много переделок!

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)

- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.

- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачность

I Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”

I Простое управлениеТри основных метода

I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных метода

I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)

I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)

I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событий

I Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщику

I Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)

I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событий

I Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibers

I Переписываем интерфейс с вебсервером- некритично, решается враппером.

I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.

I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперы

I Итого: переписываем около 5% кода.

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Библиотеки и языки

I Perl

Coro + AnyEventI Python

fibers + twistedI PHP5

появился оператор yield, fiber

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Библиотеки и языки

I PerlCoro + AnyEvent

I Python

fibers + twistedI PHP5

появился оператор yield, fiber

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5

появился оператор yield, fiber

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыкли

I Рассматриваем существующие вариантыI Node.JS

- отказались от парадигмы fibersI Tarantool...

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS

- отказались от парадигмы fibersI Tarantool...

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Tarantool

I Полноценный app-сервер

I БД на борту- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Tarantool

I Полноценный app-серверI БД на борту

- in-memory

- diskI Сокеты, диск, http-сервер, очереди

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Недостатки

I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по

CPU/хостам.

Недостатки

I Для больших проектов одного CPU все-таки маловато

I Реализации fiber’ов для традиционных ЯП плохо масштабируются поCPU/хостам.

Недостатки

I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по

CPU/хостам.

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Перспектива

I Erlang

- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам

- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение

- высокий порог вхожденияI Go

- более низкий порог вхождения

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go

- более низкий порог вхождения

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения