Передача вычислений в распределенной системе
Рассуждая тут о передаче сложных составных объектов (документы с описаниями их форм и ссылками на справочники) между разными базами данных, в итоге пришел к тому, что большая часть проблем решится, если научится передавать между границами процессов, машин и систем вообще не только значения, а еще и вычисления.
Как передать значения мы в общем-то знаем - сериализовав их в что-то понятное другому участнику обмена.
А вычисления нужно или тащить целиком с кодом и его параметрами или передавать что-то аналогичное thunk(т.е. отложенное ленивое вычисление) в виде вызова "рассчитать значение, обратившись к тому, кто передал").
А поскольку система распределенная - нам никто не обещал, что тот кто передал вычисление, на момент обращения к нему(force), вообще включен, доступен по сети, не накрылся ошибкой и прочим свиным гриппом. И что переданные данные не изменились с момента передачи. Соответственно, в таком случае все вычисления далее могут быть задержаны или же вернуть пользователю вместо ожидаемого отчета о поголовье свиней сообщение об ошибке "Schweine-Zähler Server "DOMAIN\\Zuchtsau001" Verbindung kann nicht hergestellt werden".
А все изменения данных тогда изначально должны поддерживать версионность, т.е. любые предыдущие значения должны быть доступны и идентифицируемы извне.
И, как обычно, рассуждать о этой хреновине проще всего получается в терминах чистых ленивых функциональных языков и прочей околохаскелевой жути.
Как передать значения мы в общем-то знаем - сериализовав их в что-то понятное другому участнику обмена.
А вычисления нужно или тащить целиком с кодом и его параметрами или передавать что-то аналогичное thunk(т.е. отложенное ленивое вычисление) в виде вызова "рассчитать значение, обратившись к тому, кто передал").
А поскольку система распределенная - нам никто не обещал, что тот кто передал вычисление, на момент обращения к нему(force), вообще включен, доступен по сети, не накрылся ошибкой и прочим свиным гриппом. И что переданные данные не изменились с момента передачи. Соответственно, в таком случае все вычисления далее могут быть задержаны или же вернуть пользователю вместо ожидаемого отчета о поголовье свиней сообщение об ошибке "Schweine-Zähler Server "DOMAIN\\Zuchtsau001" Verbindung kann nicht hergestellt werden".
А все изменения данных тогда изначально должны поддерживать версионность, т.е. любые предыдущие значения должны быть доступны и идентифицируемы извне.
И, как обычно, рассуждать о этой хреновине проще всего получается в терминах чистых ленивых функциональных языков и прочей околохаскелевой жути.
no subject
Или просто Erlang. Мы именно так и делаем: передаём код на другую машину, чтобы он там исполнился, вместе с аргументами (которые являются ссылками на процессы на первой машине).
no subject
no subject
1. Если первой машине всё-таки нужен будет этот результат после окончания процессинга, то:
1.1 если нужно обрабатывать только недолгие подвисания, то и так сойдёт (голый Erlang, у него передача сообщений асинхронно)
1.2 если нужно обрабатывать ребуты, то AMQP + Erlang
2. Если машине не нужен будет результат после окончания процессинга, то нужно просто игнорировать возвращённый результат.
3. Если машине нужен будет результат, но другой (ибо контекст поменялся), то метку контекста можно прилагать к возвращаемому значению, чтобы определить, можно ли результат использовать.
Приведи пример процессинга из жизни, я тебе код набросаю.
no subject
no subject
no subject
Еще есть императивный язык E, который, кажется, это то же умеет.
no subject
Это видится невыполнимым?
no subject
no subject
no subject