SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
CoreHard C++ Winter 2017
Шишки, набитые за 15 лет
использования акторов в C++
Евгений Охотников
Откуда ноги растут?
SObjectizer:
● фреймворк для C++11;
● поддерживает Actor Model, Publish-Subscribe, CSP;
● OpenSource, BSD-3-Clause лицензия;
● кросс-платформа (Linux, FreeBSD, Windows, MacOS).
Одна из немногих живых и развивающихся OpenSource-реализаций Модели
Акторов для C++.
В работе с 2002-го года.
2
Для солидности...
С первого же дня в реальной разработке. В том числе:
● электронная и мобильная коммерция;
● мобильный банкинг;
● агрегация SMS/USSD-трафика;
● имитационное моделирование;
● тестовые стенды для проверки ПО АСУ ж/д транспорта;
● прототипирование распределенной системы сбора измерительной
информации.
Часть систем до сих пор в активной эксплуатации.
3
О чем пойдет речь?
О граблях, подводных камнях и набитых шишках.
Вряд ли что-то новое для Erlang-еров.
Но среди C++ников едва ли много Erlang-еров.
Да и C++ – это не Erlang, есть своя специфика.
4
Совсем коротко о Модели Акторов
В основе всего три простых принципа:
● актор – это сущность, обладающая поведением;
● акторы реагируют на входящие сообщения;
● получив сообщение, актор может:
○ отослать некоторое (конечное) количество сообщений другим акторам;
○ создать некоторое (конечное) количество новых акторов;
○ определить для себя новое поведение для обработки последующих
сообщений.
Далее "актор" == "агент" и наоборот.
5
Акторы в C++ двумя словами: это здорово!
Конкретнее:
● у каждого агента свое изолированное состояние (принцип shared
nothing), что упрощает жизнь в многопоточном коде;
● обмен сообщениями – естественный подход к решению некоторых типов
задач;
● слабая связность между компонентами;
● очень простая работа с таймерами (отложенные и периодические
сообщения);
● низкий порог входа для новичков.
6
НО!
Здорово только когда Модель Акторов хорошо ложится на задачу.
Ложится далеко не всегда хорошо.
7
Тем не менее...
Если Модель Акторов подходит для решения задачи, то правильный
фреймворк упростит жизнь еще больше.
8
Очевидно, что правильный всего один: название начинается с SObj... ;)
Грабли №1
Перегрузка агентов
9
Что такое перегрузка агентов?
10
Откуда берется перегрузка агентов?
Back-pressure на асинхронных сообщениях – это не просто. Да и не очень
надежно.
Агент-отправитель сообщения может не иметь представления о том,
насколько загружен получатель.
Еще хуже, когда агентов-оправителей несколько. И они разделяют общую
рабочую нить.
Еще хуже, когда агент отправляет сообщение самому себе...
11
Очевидно, что агентов нужно защищать, но...
Хороший механизм защиты от перегрузки
должен быть "заточен" под конкретную
задачу.
12
Что хорошо заработало у нас?
Пара агентов: collector + performer.
Обязательно работают на разных нитях.
Агент-collector накапливает сообщения и реализует нужную политику защиты
от перегрузки, например:
● выбрасывание самых "свежих";
● выбрасывание самых "старых";
● выбор другого режима обработки и т.д.
Агент-performer забирает сообщения у collector-а. Пачками.
13
Хочется чего-то готового "из коробки"
Мы добавили в SObjectizer механизм message limits:
class collector : public so_5::agent_t {
public :
collector(context_t ctx, so_5::mbox_t quick_n_dirty)
: so_5::agent_t(ctx
// Запроса get_status достаточно всего одного.
+ limit_then_drop<get_status>(1)
// Лишние запросы будут передаваться другому агенту,
// который работает более грубо, но быстро.
+ limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } )
// Если же не успеваем отдавать накопленное, то работать
// дальше не имеет смысла.
+ limit_then_abort<get_messages>(1))
...
};
14
limit_then_drop
class collector : public so_5::agent_t {
public :
collector(context_t ctx, so_5::mbox_t quick_n_dirty)
: so_5::agent_t(ctx
// Запроса get_status достаточно всего одного.
+ limit_then_drop<get_status>(1)
// Лишние запросы будут передаваться другому агенту,
// который работает более грубо, но быстро.
+ limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } )
// Если же не успеваем отдавать накопленное, то работать
// дальше не имеет смысла.
+ limit_then_abort<get_messages>(1))
...
};
15
limit_then_redirect
class collector : public so_5::agent_t {
public :
collector(context_t ctx, so_5::mbox_t quick_n_dirty)
: so_5::agent_t(ctx
// Запроса get_status достаточно всего одного.
+ limit_then_drop<get_status>(1)
// Лишние запросы будут передаваться другому агенту,
// который работает более грубо, но быстро.
+ limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } )
// Если же не успеваем отдавать накопленное, то работать
// дальше не имеет смысла.
+ limit_then_abort<get_messages>(1))
...
};
16
limit_then_abort
class collector : public so_5::agent_t {
public :
collector(context_t ctx, so_5::mbox_t quick_n_dirty)
: so_5::agent_t(ctx
// Запроса get_status достаточно всего одного.
+ limit_then_drop<get_status>(1)
// Лишние запросы будут передаваться другому агенту,
// который работает более грубо, но быстро.
+ limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } )
// Если же не успеваем отдавать накопленное, то работать
// дальше не имеет смысла.
+ limit_then_abort<get_messages>(1))
...
};
17
Грабли №2
Доставка сообщения не гарантирована
18
Сообщение не обязательно будет обработано
Ибо:
● получателя может и не быть. Например, успел исчезнуть из системы;
● получатель есть, но само сообщение ему не интересно;
● получатель есть, сообщение ему интересно, но сработал механизм
защиты от перегрузок...
19
Чем это может грозить?
20
Что делать?
Пара самых простых способов:
1. Перепосылка после тайм-аута.
Однако, можно спровоцировать перегрузку!
2. Откат операции после тайм-аута. Или выставление статуса "результат
неизвестен".
21
Забавный парадокс:
Казалось бы, отсутствие гарантий доставки сообщения не способствует
написанию надежных приложений...
Однако, на практике оказывается наоборот.
Если прикладные агенты умеют переживать потерю сообщений, то они
зачастую справляются с запланированными и незапланированными
нештатными ситуациями.
22
Грабли №3
Коды ошибок или исключения
23
Немного истории
SObjectizer-4, 2002-й год, нет исключений, есть коды возврата.
Практика показала: коды ошибок не способствуют написанию надежного
кода.
SObjectizer-5, 2010-й год, используются исключения.
Положительное влияние на надежность. По крайней мере мне так кажется.
24
Вопрос почти на миллион:
Что делать с исключениями, которые вылетели из агента наружу?
Два важных фактора:
● исключение ловит SObjectizer и он не знает, что означает исключение;
● можно попробовать доставить исключение отправителю сообщения, но:
○ отправителя может уже не быть;
○ отправителю это не нужно;
○ до отправителя эта информация может не дойти (доставка сообщений не
гарантируется).
25
exception_reaction в SObjectizer
В SObjectizer есть возможность указать, что делать, если агент выпускает
наружу исключение:
● abort_on_exception
● shutdown_sobjectizer_on_exception
● deregister_coop_on_exception
● ignore_exception
Вариант deregister_coop_on_exception + механизм dereg_notificator позволяет
реализовать механизм супервизоров, если в этом есть необходимость.
26
С++ не настолько безопасен, как Erlang
В Erlang есть изоляция процессов. В C++ нет никакой изоляции между
агентами.
Если агент выполнит деление на ноль, то в C++ упадет не только этот агент.
Если агент в C++ оставит какой-то мусор в памяти, то это повлияет на все
приложение.
Агенты в C++ должны обеспечивать хотя бы базовый уровень гарантии
безопасности исключений. Ибо деструкторы для них будут вызываться
нормальным образом.
27
С++ не прощает стиль "тяп-ляп"
Принцип "let it crash" в C++ выглядит сильно иначе, чем в Erlang. По меньшей
мере о базовой гарантии нужно заботиться...
Естественным образом разработчик приходит к стилю, когда:
● обеспечивается nothrow-гарантия;
● любое выскочившее из агента исключение должно убивать все
приложение.
28
Грабли №4
Народ просит хлеба и зрелищ
синхронности
29
Из непонятого...
Краеугольный камень Модели Акторов – это асинхронность.
Практически все бонусы проистекают именно из этого.
Бери да пользуйся (используй то, что под рукою и не ищи себе другое)...
Но, нет.
Почему-то народ просит синхронности.
30
Ну раз просит :)
Инициация синхронного запроса:
struct get_messages : public so_5::signal_t {};
...
auto msgs = request_value<std::vector<message>, get_messages>(mbox, so_5::infinite_wait);
for(const auto & m : msgs) ...
31
Тип результата Тип запроса Адресат запроса Сколько ждать
Ну раз просит :)
Обработка синхронного запроса:
class collector : public so_5::agent_t {
public :
...
virtual void so_define_agent() override {
so_subscribe(mbox).event<get_messages>(&collector::on_get_messages);
...
}
private :
std::vector<messages> collected_messages_;
std::vector<messages> on_get_messages() {
std::vector<messages> r;
std::swap(r, collected_messages_);
return r;
}
};
32
Под капотом
struct special_message : public so_5::message_t {
std::promise<std::vector<messages>> promise_;
...
};
collector * collector_agent = ...;
auto actual_message_handler = [collector_agent](special_message & cmd) {
try {
cmd.promise_.set_value(collector_agent->on_get_messages());
}
catch(...) {
cmd.promise_.set_exception(std::current_exception());
}
};
do_special_subscribe<get_messages, special_message>(mbox, actual_message_handler);
33
request_value: за и против
34
Использование request_value чревато возникновением deadlock-ов.
request_value следует использовать с большой осторожностью.
request_value оказался очень удобен для реализации общения collector-ов и
performer-ов.
Грабли №5
Распределенность "из коробки":
плюсы и минусы
35
В SObjectizer-4 распределенность была
36
У нас был свой протокол поверх TCP/IP, свой способ сериализации C++ных
структур данных.
SObjectizer занимался маршрутизацией, (де)сериализацией, контролем I/O
операций, переподключением при разрывах...
Посредством несложных телодвижений получались распределенные
приложения.
Все было хорошо, пока нагрузки были небольшими, а трафик – однородным.
В чем проблема? (1)
37
Под каждый тип взаимодействия хорошо бы иметь свой протокол.
Обмен большими бинарными блоками – это одно. Например, передача
кусков аудио-, видеоданных, архивов и т.д.
Обмен телеметрией – другое. Например, передача мелких сообщений с
результатами замеров температуры воздуха.
Еще интереснее, когда в одном канале смешивается трафик с разными
приоритетами...
В чем проблема? (2)
38
Back pressure для асинхронного взаимодействия – это непросто.
В случае IPC – это еще более непросто.
Задержки в сети или подтормаживание узлов и сразу:
● большие объемы непереданных сообщений;
● перепосылки (нужные и не нужные);
● значительные потери при разрывах каналов.
В чем проблема? (3)
39
В современных больших распределенных приложениях используется далеко
не только C++.
Интероперабельность с другими языками must have.
Кастомные протоколы, заточенные исключительно под C++ усложняют
жизнь, а не упрощают ее.
В итоге в SObjectizer-5 распределенности нет
40
От поддержки распределенности "из коробки" в SObjectizer-5 мы отказались.
Наш интерес в том, чтобы упростить агентам общение с внешним миром
посредством де-факто стандартных средств:
● AMQP, HTTP, MQTT,...
● JSON, Protobuf, Thrift,...
Грабли №6
Много агентов – это проблема,
а не решение.
SEDA-вэй форева!
41
Акторы легковесны...
42
...поэтому их можно создавать тысячами, десятками тысяч, миллионами,
десятками миллионов.
Такие слова можно отыскать в маркетинговых материалах практически всех
реализаций Модели Акторов (а мы что, лысые что ли?)
Действительно, создать миллион акторов не сложно.
От этой возможности поначалу съезжает крыша.
Эффект птичьей стаи
43
Каждый агент ведет себя по простым и понятным правилам.
Понять, что происходит в программе с 10K агентами сложно.
Предсказать, как поведет себя программа с 10K агентами – еще сложнее.
Интроспекция важна
44
Иногда бывает важно понять, что происходит с конкретным агентом.
Насколько он загружен? Сколько времени тратит?
В Erlang-е есть готовые инструменты для интроспекции.
В мире C++ все не так радужно. В том числе потому, что зачастую C++
инструментарий разрабатывается на чистом энтузиазме.
Внезапные всплески активности
45
В какой-то момент может возникнуть столько сообщений, сколько
прикладные агенты не смогут "переварить".
Допустим:
● 100K агентов, каждый инициирует отложенное сообщение;
● за короткое время срабатывает 10K таймеров;
● на обработку каждого такого сообщения требуется 10ms;
● 100s при обработке в один поток, 25s – в четыре потока, 10s – в десять
параллельных потоков.
Одно другому не мешает
46
Внезапные всплески активности очень хорошо сочетаются с эффектом
птичьей стаи.
Добавляем сюда отсутствие интроспекции.
Желание создавать 10K агентов резко сменяется желанием обойтись всего
сотней агентов. Еще лучше – десятком.
SEDA-way
47
SEDA: Staged Event-Driven Architecture
Начало 2000-х. Исследовательская работа маленького коллектива.
Развитие давным-давно прекратилось.
Но идеи более чем здравые.
Пример с потолка: обслуживание платежа
48
Совсем грубо и не точно, но наглядно:
1. Получить запрос.
2. Проверить корректность параметров платежа.
3. Проверить возможность платежа для клиента (например, превышение
суточных лимитов).
4. Проверить рисковость платежа (анти-фрод).
5. Провести списание средств.
Обслуживание платежа: решение "в лоб"
49
Обслуживание платежа: в стиле SEDA
50
Обслуживание платежа: бонусы от SEDA-стиля
51
Упрощается контроль и мониторинг.
Упрощается защита от перегрузок.
При работе СУБД появляется возможность использовать bulk-операции.
Появляется возможность дозирования активности агентов.
Уже почти все...
52
Модель Акторов отнюдь не серебряная пуля
53
Для успешного применения нужны:
1. Голова на плечах прикладного разработчика. Это редкость, но все же...
2. Набор батареек в акторном фреймворке:
○ для защиты акторов от перегрузок;
○ для обнаружения и преодоления ошибок;
○ для интроспекции (а также сбора статистики и мониторинга);
○ для упрощения отладки и пр.
Мы постепенно оснащаем SObjectizer такими батарейками, но это небыстрый
и непростой процесс.
Маленький совет
54
При выборе акторного фреймворка обратите внимание на то, что идет в
комплекте.
Интересные идеи и красивые примеры – это хорошо. Но стоит недорого.
Дополнительные инструменты, вроде средств для интроспекции и
мониторинга – вот это показатель качества и зрелости.
Ну и делать свой акторный фреймворк для C++ сейчас не самая хорошая
идея.
Спасибо за терпение!
Вопросы?
55
Документация по SObjectizer: https://sourceforge.net/p/sobjectizer/wiki/Home/
Серия статей о SObjectizer на русском:
SObjectizer: что это, для чего это и почему это выглядит именно так? От простого к сложному:
Часть I, Часть II, Часть III. Акторы в виде конечных автоматов – это плохо или хорошо?
Проблема перегрузки агентов и средства борьбы с ней. Нежная дружба агентов и
исключений.
Серия презентаций о SObjectizer на английском "Dive into SObjectizer-5.5":
Intro, Agent's States, More About Coops, Exceptions, Timers, Synchonous Interaction, Message
Limits, Dispatchers, Message Chains.
Блог автора доклада: eao197.blogspot.com
О SObjectizer в блоге: eao197.blogspot.com/search/label/SObjectizer
Почта автора доклада: eao197 на gmail тчк com
56

Contenu connexe

Tendances

Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?corehard_by
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 

Tendances (20)

Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 

En vedette

Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Yauheni Akhotnikau
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 
Метаобъектная система Qt
Метаобъектная система QtМетаобъектная система Qt
Метаобъектная система QtPlatonov Sergey
 
C++ Actor Model - You’ve Got Mail ...
C++ Actor Model - You’ve Got Mail ...C++ Actor Model - You’ve Got Mail ...
C++ Actor Model - You’ve Got Mail ...Gianluca Padovani
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в AkkaZheka Kozlov
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеIlia Shishkov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit TestingDmitry Vyukov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейSergey Platonov
 
Работа с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр АлексеевРабота с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр АлексеевAleksander Alekseev
 

En vedette (20)

Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Метаобъектная система Qt
Метаобъектная система QtМетаобъектная система Qt
Метаобъектная система Qt
 
C++ Actor Model - You’ve Got Mail ...
C++ Actor Model - You’ve Got Mail ...C++ Actor Model - You’ve Got Mail ...
C++ Actor Model - You’ve Got Mail ...
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 
Работа с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр АлексеевРабота с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр Алексеев
 

Similaire à Шишки, набитые за 15 лет использования акторов в C++

Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profitcorehard_by
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Yauheni Akhotnikau
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Архитектуре проектов на примере интеграции TourIndex, TourDealer
Архитектуре проектов на примере интеграции TourIndex, TourDealerАрхитектуре проектов на примере интеграции TourIndex, TourDealer
Архитектуре проектов на примере интеграции TourIndex, TourDealerVitaly Belenky
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Performance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machinePerformance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machineReturn on Intelligence
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Ontico
 
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019corehard_by
 
Как не подавиться большим старым проектом
Как не подавиться большим старым проектомКак не подавиться большим старым проектом
Как не подавиться большим старым проектомAndrey Karpov
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...Yauheni Akhotnikau
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоDotNetConf
 

Similaire à Шишки, набитые за 15 лет использования акторов в C++ (20)

Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
Обзор SObjectizer 5.5
Обзор SObjectizer 5.5Обзор SObjectizer 5.5
Обзор SObjectizer 5.5
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Архитектуре проектов на примере интеграции TourIndex, TourDealer
Архитектуре проектов на примере интеграции TourIndex, TourDealerАрхитектуре проектов на примере интеграции TourIndex, TourDealer
Архитектуре проектов на примере интеграции TourIndex, TourDealer
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Performance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machinePerformance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machine
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
 
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
 
Как не подавиться большим старым проектом
Как не подавиться большим старым проектомКак не подавиться большим старым проектом
Как не подавиться большим старым проектом
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешево
 

Plus de Yauheni Akhotnikau

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world exampleYauheni Akhotnikau
 
Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Yauheni Akhotnikau
 
What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)Yauheni Akhotnikau
 
What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)Yauheni Akhotnikau
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Yauheni Akhotnikau
 
25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My EyesYauheni Akhotnikau
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersYauheni Akhotnikau
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersYauheni Akhotnikau
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionDive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsDive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partDive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partYauheni Akhotnikau
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьYauheni Akhotnikau
 

Plus de Yauheni Akhotnikau (20)

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world example
 
Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)
 
What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)
 
What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
 
25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message Chains
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message Limits
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: Timers
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8
 
Dive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionDive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. Exception
 
Dive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsDive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. Coops
 
Dive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partDive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory part
 
What is SObjectizer 5.5
What is SObjectizer 5.5What is SObjectizer 5.5
What is SObjectizer 5.5
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная часть
 

Шишки, набитые за 15 лет использования акторов в C++

  • 1. CoreHard C++ Winter 2017 Шишки, набитые за 15 лет использования акторов в C++ Евгений Охотников
  • 2. Откуда ноги растут? SObjectizer: ● фреймворк для C++11; ● поддерживает Actor Model, Publish-Subscribe, CSP; ● OpenSource, BSD-3-Clause лицензия; ● кросс-платформа (Linux, FreeBSD, Windows, MacOS). Одна из немногих живых и развивающихся OpenSource-реализаций Модели Акторов для C++. В работе с 2002-го года. 2
  • 3. Для солидности... С первого же дня в реальной разработке. В том числе: ● электронная и мобильная коммерция; ● мобильный банкинг; ● агрегация SMS/USSD-трафика; ● имитационное моделирование; ● тестовые стенды для проверки ПО АСУ ж/д транспорта; ● прототипирование распределенной системы сбора измерительной информации. Часть систем до сих пор в активной эксплуатации. 3
  • 4. О чем пойдет речь? О граблях, подводных камнях и набитых шишках. Вряд ли что-то новое для Erlang-еров. Но среди C++ников едва ли много Erlang-еров. Да и C++ – это не Erlang, есть своя специфика. 4
  • 5. Совсем коротко о Модели Акторов В основе всего три простых принципа: ● актор – это сущность, обладающая поведением; ● акторы реагируют на входящие сообщения; ● получив сообщение, актор может: ○ отослать некоторое (конечное) количество сообщений другим акторам; ○ создать некоторое (конечное) количество новых акторов; ○ определить для себя новое поведение для обработки последующих сообщений. Далее "актор" == "агент" и наоборот. 5
  • 6. Акторы в C++ двумя словами: это здорово! Конкретнее: ● у каждого агента свое изолированное состояние (принцип shared nothing), что упрощает жизнь в многопоточном коде; ● обмен сообщениями – естественный подход к решению некоторых типов задач; ● слабая связность между компонентами; ● очень простая работа с таймерами (отложенные и периодические сообщения); ● низкий порог входа для новичков. 6
  • 7. НО! Здорово только когда Модель Акторов хорошо ложится на задачу. Ложится далеко не всегда хорошо. 7
  • 8. Тем не менее... Если Модель Акторов подходит для решения задачи, то правильный фреймворк упростит жизнь еще больше. 8 Очевидно, что правильный всего один: название начинается с SObj... ;)
  • 11. Откуда берется перегрузка агентов? Back-pressure на асинхронных сообщениях – это не просто. Да и не очень надежно. Агент-отправитель сообщения может не иметь представления о том, насколько загружен получатель. Еще хуже, когда агентов-оправителей несколько. И они разделяют общую рабочую нить. Еще хуже, когда агент отправляет сообщение самому себе... 11
  • 12. Очевидно, что агентов нужно защищать, но... Хороший механизм защиты от перегрузки должен быть "заточен" под конкретную задачу. 12
  • 13. Что хорошо заработало у нас? Пара агентов: collector + performer. Обязательно работают на разных нитях. Агент-collector накапливает сообщения и реализует нужную политику защиты от перегрузки, например: ● выбрасывание самых "свежих"; ● выбрасывание самых "старых"; ● выбор другого режима обработки и т.д. Агент-performer забирает сообщения у collector-а. Пачками. 13
  • 14. Хочется чего-то готового "из коробки" Мы добавили в SObjectizer механизм message limits: class collector : public so_5::agent_t { public : collector(context_t ctx, so_5::mbox_t quick_n_dirty) : so_5::agent_t(ctx // Запроса get_status достаточно всего одного. + limit_then_drop<get_status>(1) // Лишние запросы будут передаваться другому агенту, // который работает более грубо, но быстро. + limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } ) // Если же не успеваем отдавать накопленное, то работать // дальше не имеет смысла. + limit_then_abort<get_messages>(1)) ... }; 14
  • 15. limit_then_drop class collector : public so_5::agent_t { public : collector(context_t ctx, so_5::mbox_t quick_n_dirty) : so_5::agent_t(ctx // Запроса get_status достаточно всего одного. + limit_then_drop<get_status>(1) // Лишние запросы будут передаваться другому агенту, // который работает более грубо, но быстро. + limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } ) // Если же не успеваем отдавать накопленное, то работать // дальше не имеет смысла. + limit_then_abort<get_messages>(1)) ... }; 15
  • 16. limit_then_redirect class collector : public so_5::agent_t { public : collector(context_t ctx, so_5::mbox_t quick_n_dirty) : so_5::agent_t(ctx // Запроса get_status достаточно всего одного. + limit_then_drop<get_status>(1) // Лишние запросы будут передаваться другому агенту, // который работает более грубо, но быстро. + limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } ) // Если же не успеваем отдавать накопленное, то работать // дальше не имеет смысла. + limit_then_abort<get_messages>(1)) ... }; 16
  • 17. limit_then_abort class collector : public so_5::agent_t { public : collector(context_t ctx, so_5::mbox_t quick_n_dirty) : so_5::agent_t(ctx // Запроса get_status достаточно всего одного. + limit_then_drop<get_status>(1) // Лишние запросы будут передаваться другому агенту, // который работает более грубо, но быстро. + limit_then_redirect<request>(50, [quick_n_dirty]{ return quick_n_dirty; } ) // Если же не успеваем отдавать накопленное, то работать // дальше не имеет смысла. + limit_then_abort<get_messages>(1)) ... }; 17
  • 18. Грабли №2 Доставка сообщения не гарантирована 18
  • 19. Сообщение не обязательно будет обработано Ибо: ● получателя может и не быть. Например, успел исчезнуть из системы; ● получатель есть, но само сообщение ему не интересно; ● получатель есть, сообщение ему интересно, но сработал механизм защиты от перегрузок... 19
  • 20. Чем это может грозить? 20
  • 21. Что делать? Пара самых простых способов: 1. Перепосылка после тайм-аута. Однако, можно спровоцировать перегрузку! 2. Откат операции после тайм-аута. Или выставление статуса "результат неизвестен". 21
  • 22. Забавный парадокс: Казалось бы, отсутствие гарантий доставки сообщения не способствует написанию надежных приложений... Однако, на практике оказывается наоборот. Если прикладные агенты умеют переживать потерю сообщений, то они зачастую справляются с запланированными и незапланированными нештатными ситуациями. 22
  • 23. Грабли №3 Коды ошибок или исключения 23
  • 24. Немного истории SObjectizer-4, 2002-й год, нет исключений, есть коды возврата. Практика показала: коды ошибок не способствуют написанию надежного кода. SObjectizer-5, 2010-й год, используются исключения. Положительное влияние на надежность. По крайней мере мне так кажется. 24
  • 25. Вопрос почти на миллион: Что делать с исключениями, которые вылетели из агента наружу? Два важных фактора: ● исключение ловит SObjectizer и он не знает, что означает исключение; ● можно попробовать доставить исключение отправителю сообщения, но: ○ отправителя может уже не быть; ○ отправителю это не нужно; ○ до отправителя эта информация может не дойти (доставка сообщений не гарантируется). 25
  • 26. exception_reaction в SObjectizer В SObjectizer есть возможность указать, что делать, если агент выпускает наружу исключение: ● abort_on_exception ● shutdown_sobjectizer_on_exception ● deregister_coop_on_exception ● ignore_exception Вариант deregister_coop_on_exception + механизм dereg_notificator позволяет реализовать механизм супервизоров, если в этом есть необходимость. 26
  • 27. С++ не настолько безопасен, как Erlang В Erlang есть изоляция процессов. В C++ нет никакой изоляции между агентами. Если агент выполнит деление на ноль, то в C++ упадет не только этот агент. Если агент в C++ оставит какой-то мусор в памяти, то это повлияет на все приложение. Агенты в C++ должны обеспечивать хотя бы базовый уровень гарантии безопасности исключений. Ибо деструкторы для них будут вызываться нормальным образом. 27
  • 28. С++ не прощает стиль "тяп-ляп" Принцип "let it crash" в C++ выглядит сильно иначе, чем в Erlang. По меньшей мере о базовой гарантии нужно заботиться... Естественным образом разработчик приходит к стилю, когда: ● обеспечивается nothrow-гарантия; ● любое выскочившее из агента исключение должно убивать все приложение. 28
  • 29. Грабли №4 Народ просит хлеба и зрелищ синхронности 29
  • 30. Из непонятого... Краеугольный камень Модели Акторов – это асинхронность. Практически все бонусы проистекают именно из этого. Бери да пользуйся (используй то, что под рукою и не ищи себе другое)... Но, нет. Почему-то народ просит синхронности. 30
  • 31. Ну раз просит :) Инициация синхронного запроса: struct get_messages : public so_5::signal_t {}; ... auto msgs = request_value<std::vector<message>, get_messages>(mbox, so_5::infinite_wait); for(const auto & m : msgs) ... 31 Тип результата Тип запроса Адресат запроса Сколько ждать
  • 32. Ну раз просит :) Обработка синхронного запроса: class collector : public so_5::agent_t { public : ... virtual void so_define_agent() override { so_subscribe(mbox).event<get_messages>(&collector::on_get_messages); ... } private : std::vector<messages> collected_messages_; std::vector<messages> on_get_messages() { std::vector<messages> r; std::swap(r, collected_messages_); return r; } }; 32
  • 33. Под капотом struct special_message : public so_5::message_t { std::promise<std::vector<messages>> promise_; ... }; collector * collector_agent = ...; auto actual_message_handler = [collector_agent](special_message & cmd) { try { cmd.promise_.set_value(collector_agent->on_get_messages()); } catch(...) { cmd.promise_.set_exception(std::current_exception()); } }; do_special_subscribe<get_messages, special_message>(mbox, actual_message_handler); 33
  • 34. request_value: за и против 34 Использование request_value чревато возникновением deadlock-ов. request_value следует использовать с большой осторожностью. request_value оказался очень удобен для реализации общения collector-ов и performer-ов.
  • 35. Грабли №5 Распределенность "из коробки": плюсы и минусы 35
  • 36. В SObjectizer-4 распределенность была 36 У нас был свой протокол поверх TCP/IP, свой способ сериализации C++ных структур данных. SObjectizer занимался маршрутизацией, (де)сериализацией, контролем I/O операций, переподключением при разрывах... Посредством несложных телодвижений получались распределенные приложения. Все было хорошо, пока нагрузки были небольшими, а трафик – однородным.
  • 37. В чем проблема? (1) 37 Под каждый тип взаимодействия хорошо бы иметь свой протокол. Обмен большими бинарными блоками – это одно. Например, передача кусков аудио-, видеоданных, архивов и т.д. Обмен телеметрией – другое. Например, передача мелких сообщений с результатами замеров температуры воздуха. Еще интереснее, когда в одном канале смешивается трафик с разными приоритетами...
  • 38. В чем проблема? (2) 38 Back pressure для асинхронного взаимодействия – это непросто. В случае IPC – это еще более непросто. Задержки в сети или подтормаживание узлов и сразу: ● большие объемы непереданных сообщений; ● перепосылки (нужные и не нужные); ● значительные потери при разрывах каналов.
  • 39. В чем проблема? (3) 39 В современных больших распределенных приложениях используется далеко не только C++. Интероперабельность с другими языками must have. Кастомные протоколы, заточенные исключительно под C++ усложняют жизнь, а не упрощают ее.
  • 40. В итоге в SObjectizer-5 распределенности нет 40 От поддержки распределенности "из коробки" в SObjectizer-5 мы отказались. Наш интерес в том, чтобы упростить агентам общение с внешним миром посредством де-факто стандартных средств: ● AMQP, HTTP, MQTT,... ● JSON, Protobuf, Thrift,...
  • 41. Грабли №6 Много агентов – это проблема, а не решение. SEDA-вэй форева! 41
  • 42. Акторы легковесны... 42 ...поэтому их можно создавать тысячами, десятками тысяч, миллионами, десятками миллионов. Такие слова можно отыскать в маркетинговых материалах практически всех реализаций Модели Акторов (а мы что, лысые что ли?) Действительно, создать миллион акторов не сложно. От этой возможности поначалу съезжает крыша.
  • 43. Эффект птичьей стаи 43 Каждый агент ведет себя по простым и понятным правилам. Понять, что происходит в программе с 10K агентами сложно. Предсказать, как поведет себя программа с 10K агентами – еще сложнее.
  • 44. Интроспекция важна 44 Иногда бывает важно понять, что происходит с конкретным агентом. Насколько он загружен? Сколько времени тратит? В Erlang-е есть готовые инструменты для интроспекции. В мире C++ все не так радужно. В том числе потому, что зачастую C++ инструментарий разрабатывается на чистом энтузиазме.
  • 45. Внезапные всплески активности 45 В какой-то момент может возникнуть столько сообщений, сколько прикладные агенты не смогут "переварить". Допустим: ● 100K агентов, каждый инициирует отложенное сообщение; ● за короткое время срабатывает 10K таймеров; ● на обработку каждого такого сообщения требуется 10ms; ● 100s при обработке в один поток, 25s – в четыре потока, 10s – в десять параллельных потоков.
  • 46. Одно другому не мешает 46 Внезапные всплески активности очень хорошо сочетаются с эффектом птичьей стаи. Добавляем сюда отсутствие интроспекции. Желание создавать 10K агентов резко сменяется желанием обойтись всего сотней агентов. Еще лучше – десятком.
  • 47. SEDA-way 47 SEDA: Staged Event-Driven Architecture Начало 2000-х. Исследовательская работа маленького коллектива. Развитие давным-давно прекратилось. Но идеи более чем здравые.
  • 48. Пример с потолка: обслуживание платежа 48 Совсем грубо и не точно, но наглядно: 1. Получить запрос. 2. Проверить корректность параметров платежа. 3. Проверить возможность платежа для клиента (например, превышение суточных лимитов). 4. Проверить рисковость платежа (анти-фрод). 5. Провести списание средств.
  • 51. Обслуживание платежа: бонусы от SEDA-стиля 51 Упрощается контроль и мониторинг. Упрощается защита от перегрузок. При работе СУБД появляется возможность использовать bulk-операции. Появляется возможность дозирования активности агентов.
  • 53. Модель Акторов отнюдь не серебряная пуля 53 Для успешного применения нужны: 1. Голова на плечах прикладного разработчика. Это редкость, но все же... 2. Набор батареек в акторном фреймворке: ○ для защиты акторов от перегрузок; ○ для обнаружения и преодоления ошибок; ○ для интроспекции (а также сбора статистики и мониторинга); ○ для упрощения отладки и пр. Мы постепенно оснащаем SObjectizer такими батарейками, но это небыстрый и непростой процесс.
  • 54. Маленький совет 54 При выборе акторного фреймворка обратите внимание на то, что идет в комплекте. Интересные идеи и красивые примеры – это хорошо. Но стоит недорого. Дополнительные инструменты, вроде средств для интроспекции и мониторинга – вот это показатель качества и зрелости. Ну и делать свой акторный фреймворк для C++ сейчас не самая хорошая идея.
  • 56. Документация по SObjectizer: https://sourceforge.net/p/sobjectizer/wiki/Home/ Серия статей о SObjectizer на русском: SObjectizer: что это, для чего это и почему это выглядит именно так? От простого к сложному: Часть I, Часть II, Часть III. Акторы в виде конечных автоматов – это плохо или хорошо? Проблема перегрузки агентов и средства борьбы с ней. Нежная дружба агентов и исключений. Серия презентаций о SObjectizer на английском "Dive into SObjectizer-5.5": Intro, Agent's States, More About Coops, Exceptions, Timers, Synchonous Interaction, Message Limits, Dispatchers, Message Chains. Блог автора доклада: eao197.blogspot.com О SObjectizer в блоге: eao197.blogspot.com/search/label/SObjectizer Почта автора доклада: eao197 на gmail тчк com 56