| | 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 | |