Apache Ignite CollisionSpi 配置
Apache Ignite CollisionSpi configuration
我有一个要求,例如“只允许在同一缓存上按顺序对 运行 进行缓存更新”。我们的客户端节点是用 .net 编写的。
每个缓存都有关联键,我们使用 computeJob.AffinityCallAsync("cacheName", "affinityKey", job) 提交计算作业以供执行。
现在如果我使用 collisionSpi,我可以实现“同步作业 运行在同一节点上针对同一缓存”吗?我需要使用什么配置?
我需要为所有节点(服务器和客户端)编写相同的配置吗?我看到 collisionSpi 没有 .net 的实现,那么我可以为 .net 客户端节点做什么?
将您的作业逻辑包装在 lock
中,使其按顺序 运行:
public class MyJob : IComputeFunc<string>
{
private static readonly object SyncRoot = new object();
public string Invoke()
{
lock (SyncRoot)
{
// Update cache
}
}
}
备注:
ICache.Invoke
可能更适合您的用例
- 顺序更新的要求听起来很奇怪,可能会导致性能欠佳:Ignite 缓存可以安全地同时更新。请确保此要求有意义。
更新
添加锁将确保在给定节点上一次发生一个更新。其他节点可以并行执行更新。也不能保证更新的顺序。
我有一个要求,例如“只允许在同一缓存上按顺序对 运行 进行缓存更新”。我们的客户端节点是用 .net 编写的。
每个缓存都有关联键,我们使用 computeJob.AffinityCallAsync("cacheName", "affinityKey", job) 提交计算作业以供执行。
现在如果我使用 collisionSpi,我可以实现“同步作业 运行在同一节点上针对同一缓存”吗?我需要使用什么配置?
我需要为所有节点(服务器和客户端)编写相同的配置吗?我看到 collisionSpi 没有 .net 的实现,那么我可以为 .net 客户端节点做什么?
将您的作业逻辑包装在 lock
中,使其按顺序 运行:
public class MyJob : IComputeFunc<string>
{
private static readonly object SyncRoot = new object();
public string Invoke()
{
lock (SyncRoot)
{
// Update cache
}
}
}
备注:
ICache.Invoke
可能更适合您的用例- 顺序更新的要求听起来很奇怪,可能会导致性能欠佳:Ignite 缓存可以安全地同时更新。请确保此要求有意义。
更新
添加锁将确保在给定节点上一次发生一个更新。其他节点可以并行执行更新。也不能保证更新的顺序。