在Ignite.NET中,可以在“相同”节点上缓存具有相同亲和力的键值对。是否可以定义应该使用的特定节点?
这是一个测试程序,我想定义一个节点来缓存关联性“customer”,另一个节点来缓存关联性“member”。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (var ignite = Ignition.Start())
{
var cache = ignite.GetOrCreateCache<AffinityKey, Person>(new CacheConfiguration("person-cache")
{
CacheMode = CacheMode.Partitioned,
});
cache.Put(new AffinityKey(1, "customer"), new Person { Name = "Test customer", Age = 7 });
cache.Put(new AffinityKey(1, "member"), new Person { Name = "Test member", Age = 7 });
foreach (var item in cache)
{
Console.WriteLine($"{item.Key}: {item.Value.Name} - {item.Value.Age}");
}
Console.ReadKey();
}
}
}
答案 0 :(得分:1)
在您的代码中,所有客户都将进入一个分区,并且所有成员也将聚集在一个分区中,但是没有100%保证它将是两个不同的分区,这也意味着您将有错误的数据分发,因为只有两个分区,最好只能使用2个主机和2个CPU内核。
因此,对于您的情况,我建议使用两个不同的节点过滤器缓存: https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/configuration/CacheConfiguration.html#setNodeFilter(org.apache.ignite.lang.IgnitePredicate)
在谓词中,您可以指定应该使用哪个节点来存储每个缓存的数据,以及按节点分割记录。
答案 1 :(得分:1)
看起来您处于CPU Affinity的上下文中,用于将特定进程/线程分配/绑定到某个特定的CPU核心。
Apache Ignite将Affinity用于其他目的。这是collocating在同一群集节点上输入多个数据类型(缓存)的方法。因此,通过在群集的同一节点处寻址特定数据分区,亲缘关系可以提高跨缓存操作的性能,同时保持群集中的一般数据分布。
您应该使用迈克尔建议的cluster groups和/或节点过滤器。