| 6 | |
| 7 | === Нода |
| 8 | |
| 9 | - вычисления блокируют всех остальных |
| 10 | - IO через async/await |
| 11 | - блокирующий IO и долгие вычисления - моветон |
| 12 | |
| 13 | === C# |
| 14 | |
| 15 | - вычисления блокируют только наш поток |
| 16 | - IO через async-await (выглядит как блокирующий, но надо не забывать расставлять async-await) |
| 17 | - блокирующий IO моветон, долгие вычисления - полумоветон (достаточно не запускать слишком много потоков с долгими вычислениями или запускать их в явных потоках) |
| 18 | |
| 19 | === Akka |
| 20 | |
| 21 | - вычисления блокируют только наш поток |
| 22 | - IO через сообщения (выглядит как блокирующий) |
| 23 | - настоящий блокирующий IO моветон, долгие вычисления - полумоветон |
| 24 | |
| 25 | == "Внутри" и "снаружи" |
| 26 | |
| 27 | == Нода |
| 28 | |
| 29 | Снаружи |
| 30 | * пул |
| 31 | * мультиплексор |
| 32 | |
| 33 | Внутри |
| 34 | |
| 35 | * вычисления |
| 36 | * async-await (везде, где есть async-await, также есть коллбеки и промисы) |
| 37 | |
| 38 | == C# |
| 39 | |
| 40 | Cнаружи |
| 41 | * явные потоки |
| 42 | * пул |
| 43 | * мультиплексор |
| 44 | Внутри |
| 45 | * явные потоки (если очень надо) |
| 46 | * пул (если надо) |
| 47 | * async-await |
| 48 | |
| 49 | == Akka |
| 50 | |
| 51 | Снаружи: |
| 52 | * явные потоки |
| 53 | * пул |
| 54 | * мультиплексор |
| 55 | * async-await |
| 56 | |
| 57 | Внутри: |
| 58 | |
| 59 | * вычисления |
| 60 | * отправка сообщений |
| 61 | |
| 62 | |
| 63 | == Структура базового варианта приложения на Akka |
| 64 | |
| 65 | К сожалению, нет библиотек, рассчитанных на акку. То есть нам понадобится IO-библиотека, оборачивающая весь IO в акторы. Благо, в коллекторе IO немного - HTTP и веб-сокеты. Зато мы получаем очень ясный код для каждой биржи, а все неясности будут вынесены в наши модули: |
| 66 | |
| 67 | * akka.http |
| 68 | * akka.gearman |
| 69 | * akka.websocket |
| 70 | |
| 71 | Эти модули мы можем заопенсорсить и зарелизить в !NuGet. |
| 72 | |
| 73 | Таким образом, коллектор состоит из |
| 74 | |
| 75 | * "библиотечной" части, использующей "наружные" примитивы: |
| 76 | * явные потоки |
| 77 | * пул |
| 78 | * async-await |
| 79 | * собственно кода бирж, содержащего только "внутренние" примитивы: |
| 80 | * вычисления |
| 81 | * синхронные вызовы |
| 82 | |
| 83 | == Отказоустойчивость |
| 84 | |
| 85 | После реализации базовых функций необходимо реализовать средства повышения отказоустойчивости. Для этого будет реализован компонент на супервизорном API акки, занимающийся пуском-остановкой-сохранением состояния акторов коллектора. |
| 86 | |
| 87 | {{{#!comment |
| 88 | |
| 89 | === Нода |
| 90 | |
| 91 | - 1 поток |
| 92 | - долгие вычисления надо разбивать на куски, чтобы не блокировать единственный поток |
| 93 | - IO через мультиплексор: |
| 94 | - коллбеки |
| 95 | - промисы |
| 96 | - async-await |
| 97 | - блокирующий IO на крайняк |
| 98 | |
| 99 | == C# |
| 100 | |
| 101 | - от 2 до 10 потоков на ядро ("пул") |
| 102 | - длинные вычисления надо запускать в небольшом количестве инстансов, чтобы не блокировать пул |
| 103 | - IO через мультиплексор: |
| 104 | - async-await |
| 105 | - |
| 106 | |
| 107 | |
| 108 | |