Switch lang: Русский \ English

SmartFlow - реагирующая (reactive) dataflow система

SmartFlow - технология реагирующая (reactive) dataflow система предназначена для Построения dataflow из "сервисов" в облаке для алгоритма описанного плоско на нескольких или одном языке программирования

Что такое SmartFlow ?!

SmartFlow это вариант использования облачной VM (CPVM) для построения реагирующих dataflow систем (автоматические извлечение dataflow из императивно заданной системы сервисов).

smart flow concept

Это не классический вариант вычислительного процесса с "быстрой транзакцией" CPVM, а вариант когда транзакция "вечная, или долго не закрывается".

Обычный вычислителный процесс в CPVM происходит так:

  • начало транзакции
  • получение дступа к данным в TVM или загрузка данных в TVM AS хранилища
  • запуск всех вычислений
  • завершение транзакции , в случае успеха получаем/фиксируем в процессе ввода-вывода результаты

CPVM во время исполнения распараллеливает ваш код и находит и оптимизирует вычислители (ищет оптимальную гранулярность).

В _обычной короткой CPVM транзакции _ имеем следующие проблемы для тех, кто хочет активно делать ввод - вывод :

  • весь ввод-вывод надо делать через TVM, иначе зависимости не будут обнаружены и будут сбои.
  • надо обрабатывать сигналы не только перед всем процессом (загрузка даннных, но и в любой момент)
  • вывод результатов надо делать непрерывно. ане только в конце транзакции и не только при её успехе (потоковая обработка)

Как SmartFlow помогает ?

CPVM может помочь в обработке потоковых данных (stream data). Возможность определять конфликты (==читай, зависимости) и перезапуск веток транзакций могут быть использованы так:

  • транзакция бьётся на три ветки заранее, и далее каждые операции обращаются к сигналам и данным из своей ветки
    • загрузка новых данных и запись сигналов - из первой ветки
    • запуск корневого вычисления и всех производных - из второй
    • вывод результатов - из третьей
  • при новых значениях для обрабатываемого набора данных они записываются в TVM из фрагмента с доступом в TVM из первой ветки транзакции
  • если какие-то вычисления читали из из второй или третьеё ветки, то их подтранзакция будет системой перезапущена и вся цепочка вычислений будет парарасчитана!
  • все производные вычисленные значения будут вычислены далее по цепочке и это касается также вывода новых значений. фрагмент вывода перезапускается - и мы получаем новый результат в нужном месте в максимально быстрое время.

Важно, что нагрузка на систему не играет никакого значения ведь: вычислители запускаются системой одновременно на новых ядрах и по потребностям будет выделено и ресурсов (распределение задач на CPVM).

Это безопасно т.к. процессы вычислений происходят в разных ветках иерархической транзакции.

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

Это позволяет описывать плоские алгоритмы на разных/многих языках, которые будут выполняться на ресурсах в облаке, а система CPVM будет находить для них вычислители, параллелить фрагменты по ЯПФ и, по возможности, оптимизировать гранулярность (PTS).

Откуда ноги растут

В одном из G+ постов, мой знакомый, Денис Шевченко поделился переводом "A monad for reactive programming. Part 1" (Денис большой адепт FP и Haskell)

И после прочтения и в обсуждениях я захотел поделиться мини-мечтой, которая может стать реальностью. Ведь я тогда постоянно думал о новых применениях платформы (CPVM + PTS).

общая задача: (мини мечта)

Мне чаще всего реактивное программирование приходит в голову когда возникает задача кеширования.

Как в Excel: ты меняешь ячейку, а система знает, что она нужна в 5-и, например, ячейках и знает каких - пересчитывает только их.

А когда я беру значени оттуда - я его именно беру - оно больше не вычисляется...

В ЯП, ООП или ФП - не важно, функция знает только про себя, что внутри, но не знает кто её вообще вызывает и "не может заслать туда значение", чтобы там что-то пересчиталось и "кеш" обновился...

Если я вызываю фукцию, которая опирается на другие - они всегда строго выполняются все на всю глубину, если кеширования нет. Если оно есть, то существует много/больше состояний и все усложняется для программиста.

В жизни так часто бывает, что есть исходное состоние и из него получаются ещё значения. Все расчиталось, но это всё нужно, например, для отображения. Вычисляется каждый кадр, или пересчитывается при изменениях модели.

Было бы хорошо, чтобы там где можно значение бралось из кеша, а кеш бы сам обновлялся.... Кеш сам знал бы когда обновляться и делал это вовремя.

Но я таких примочек не видел пока по понятным причинам. В ФП наверное это возможно, но это рушит идею, что "функция не знает про внешний мир" ведь она же как-то обновить зависимые от нее результатов кеши должна и запустить пересчет прочих зависимых кешей. значит фреймврк кеширования знает про взаимосвязи функций, но как этого добится не понятно. во всех ФП данные - это просто днные еще и не мутабельные к тому же. а в императивных языках такое вообе сложнее - там же важен еще и порядок вычислений, так что хз.

Реактивное программировнаие и паттерны типа observable пошли по пути "автоматически среагировать сразу и пересчитать зависимости" - это путь построения каркаса или фреймворка.

TODO . Ждите примеров SmartFlow и реальных примеров.

Comments

Comments powered by Disqus
Skip to main content