问题描述
我有一个要求,例如“仅允许按顺序运行同一缓存上的缓存更新”。我们的客户端节点是用 .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 缓存并发更新是安全的。请确保此要求有意义。
更新
添加锁将确保一次更新在给定节点上。其他节点可以并行执行更新。更新顺序也无法保证。