分布式闭包如何跨点燃节点发送
How distributed closures are sent across ignite nodes
我正在查看 Apache Ignite 文档中关于使用分布式闭包的示例。
https://apacheignite-net.readme.io/docs/distributed-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;
}
}
如果此 class 存在于远程节点上,它将在反序列化后按原样使用。
如果此 class 在远程节点上不存在,则 Peer Assembly Loading 将在启用后启动,它将所需的程序集发送到远程节点。
由于 CIL 代码定义得很好,这是一个轻松的过程:它还可以根据请求将您的大部分依赖项流式传输到远程节点,包括库等。此机制的局限性在于它不会对等加载缓存的键值 classes。所以如果你需要对它们进行操作,你需要在所有节点之间分配它。
此代码将使用与您的通用 Ignite 代码相同的权限,所以是的,它没有理由不进行 HTTP 调用。请注意,将大多数库显式添加到所有节点并且仅将经常更改的 Peer Load 代码显式添加可能仍然更好。
我正在查看 Apache Ignite 文档中关于使用分布式闭包的示例。
https://apacheignite-net.readme.io/docs/distributed-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;
}
}
如果此 class 存在于远程节点上,它将在反序列化后按原样使用。 如果此 class 在远程节点上不存在,则 Peer Assembly Loading 将在启用后启动,它将所需的程序集发送到远程节点。
由于 CIL 代码定义得很好,这是一个轻松的过程:它还可以根据请求将您的大部分依赖项流式传输到远程节点,包括库等。此机制的局限性在于它不会对等加载缓存的键值 classes。所以如果你需要对它们进行操作,你需要在所有节点之间分配它。
此代码将使用与您的通用 Ignite 代码相同的权限,所以是的,它没有理由不进行 HTTP 调用。请注意,将大多数库显式添加到所有节点并且仅将经常更改的 Peer Load 代码显式添加可能仍然更好。