c# - 分布式闭包如何跨 ignite 节点发送
问题描述
我正在查看 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;
}
}
解决方案
如果此类存在于远程节点上,则在反序列化后按原样使用。如果远程节点上不存在此类,则启用对等程序集加载将启动,它将所需的程序集发送到远程节点。
由于 CIL 代码的定义非常明确,因此它是一个轻松的过程:它还可以根据请求将大部分依赖项流式传输到远程节点,包括库等。这种机制的局限性在于它不会对等加载缓存的密钥-值类。因此,如果您需要对这些进行操作,则需要在所有节点之间分发它。
此代码将使用与您的通用 Ignite 代码相同的权限,所以是的,它没有理由不进行 HTTP 调用。请注意,最好将大多数库显式添加到所有节点,并且只添加经常更改的 Peer Load 代码。
推荐阅读
- javascript - 编写 JavaScript 条件语句对三个数字进行排序
- java - Windows 更新后 Android Studio AVD 模拟器透明
- javascript - 在 chrome 本地存储中附加一个数组
- php - MySQL UPDATE WHERE 的行为与 SELECT WHERE 不同
- python - Kafka Python 使用自定义时间戳发送数据
- r - 使用 mvrnorm 预测相关值并包括时间自相关
- php - prestashop中用户帐户注册的php href
- python - 需要整数参数,得到浮点数
- javascript - 如何在 Mongoose 的单个文档中索引多个唯一数据字段?
- postgresql - 错误:postgres 中没有可用的未固定缓冲区