Как распределенные замыкания отправляются через узлы зажигания - PullRequest
0 голосов
/ 21 апреля 2019

Я смотрю на пример из документации Apache Ignite об использовании распределенных замыканий.

https://apacheignite -net.readme.io / docs / distrib-closures

Исходя из моего понимания, можно определить замыкание в клиентском узле путем реализацииинтерфейс IComputeFunc.Что мне не совсем понятно, так это то, как реализация интерфейса доставляется на узлы сервера в кластере.Есть ли документация по этому механизму?Существуют ли какие-либо ограничения в коде, который может содержать реализация замыкания?Например, разрешено ли делать http-запросы?Код вызова из внешних пакетов nuget?

Я пытался просмотреть исходный код проекта.Похоже, что реализация IComputFunc как-то двоично сериализуется с использованием метода BinaryWriter.writeobjectdetached.Мне не удалось продвинуться дальше, чем это в моем расследовании.

Ниже приведен пример, на который я смотрел:

async void Compute()
{
    using (var ignite = Ignition.Start())
    {
        var funcs = "Count characters using compute func".Split(' ')
          .Select(word => new ComputeFunc { Word = word });

        ICollection<int> res = ignite.GetCompute().Call(funcs);

        // Async mode
        res = await ignite.GetCompute().CallAsync(funcs);

        var sum = res.Sum();

        Console.WriteLine(">>> Total number of characters in the phrase is '{0}'.", sum);
    }
}

[Serializable]
class ComputeFunc : IComputeFunc<int>
{
    public string Word { get; set; }

    public int Invoke()
    {
        return Word.Length;
    }
} 

1 Ответ

1 голос
/ 22 апреля 2019

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

Поскольку код CIL довольно хорошо определен, онбезболезненный процесс: он может также передавать большую часть ваших зависимостей на удаленные узлы по запросу, включая библиотеки и т. д. Этот механизм имеет ограничение в том, что он не будет использовать классы Key-Value кэшей Peer Load.Поэтому, если вам нужно работать с ними, вам нужно распределить его между всеми узлами.

Этот код будет работать с теми же разрешениями, что и ваш общий код Ignite, поэтому да, нет никаких причин, по которым он не будет создавать HTTPзвонки.Обратите внимание, что, возможно, было бы лучше явно добавить большинство библиотек ко всем узлам и только код Peer Load, который часто меняется.

...