Паралеллизм на акторах
Надо начать издалека, чтобы было понятно
Режимы I/O
Нода
- вычисления блокируют всех остальных
- IO через async/await
- блокирующий IO и долгие вычисления - моветон
C#
- вычисления блокируют только наш поток
- IO через async-await (выглядит как блокирующий, но надо не забывать расставлять async-await)
- блокирующий IO моветон, async-await моветон, долгие вычисления - полумоветон (достаточно не запускать слишком много потоков с долгими вычислениями или запускать их в явных потоках)
Akka
- вычисления блокируют только наш поток
- IO через сообщения (выглядит как блокирующий)
- настоящий блокирующий IO моветон, долгие вычисления - полумоветон
"Внутри" и "снаружи"
Нода
Снаружи
- пул
- мультиплексор
Внутри
- вычисления
- async-await (везде, где есть async-await, также есть коллбеки и промисы)
C#
Cнаружи
- явные потоки
- пул
- мультиплексор
Внутри
- явные потоки (если очень надо)
- пул (если надо)
- async-await
Akka
Снаружи:
- явные потоки
- пул
- мультиплексор
- async-await
Внутри:
- вычисления
- отправка сообщений
Структура базового варианта приложения на Akka
К сожалению, нет библиотек, рассчитанных на акку. То есть нам понадобится IO-библиотека, оборачивающая весь IO в акторы. Благо, в коллекторе IO немного - HTTP и веб-сокеты. Зато мы получаем очень ясный код для каждой биржи, а все неясности будут вынесены в наши модули:
- akka.http
- akka.gearman
- akka.websocket
Эти модули мы можем заопенсорсить и зарелизить в NuGet.
Таким образом, коллектор состоит из
- "библиотечной" части, использующей "наружные" примитивы:
- явные потоки
- пул
- async-await
- собственно кода бирж, содержащего только "внутренние" примитивы:
- вычисления
- синхронные вызовы
Отказоустойчивость
После реализации базовых функций необходимо реализовать средства повышения отказоустойчивости. Для этого будет реализован компонент на супервизорном API акки, занимающийся пуском-остановкой-сохранением состояния акторов коллектора.