我是Apache Ignite的初学者。最近,我试图弄清楚AffinityKey是如何工作的,我遇到了一些问题。以下是我可以从Apache Ignite Example获得的课程:
public class Person implements Serializable {
private static final AtomicLong ID_GEN = new AtomicLong();
public Long id;
public Long orgId;
private transient AffinityKey<Long> key;
public Person(Long org, String firstName, String lastName, double salary, String resume) {
// Generate unique ID for this person.
id = ID_GEN.incrementAndGet();
orgId = org;
this.firstName = firstName;
this.lastName = lastName;
this.salary = salary;
this.resume = resume;
}
public Person(Long id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public AffinityKey<Long> key() {
if (key == null)
key = new AffinityKey<>(id, orgId);
return key;
}
/*Getters and Setters*/
}
public class Organization {
private static final AtomicLong ID_GEN = new AtomicLong();
private Long id;
private String name;
public Organization(long id, String name) {
this.id = id;
this.name = name;
}
}
在 Person 类中,似乎我将 Person 与 Organization 并置,并且它们应该放在同一个节点中。但是,它可能是错的。这是我的一些例子。
// People.
Person p1 = new Person((long)1, "John", "Doe", 2000, "John Doe has Master Degree.");
Person p2 = new Person((long)2, "Jane", "Doe", 1000, "Jane Doe has Bachelor Degree.");
Person p3 = new Person((long)2, "John", "Smith", 1000, "John Smith has Bachelor Degree.");
Person p4 = new Person((long)2, "Jane", "Smith", 2000, "Jane Smith has Master Degree.");
Person p5 = new Person((long)2, "John", "Harden", 1000, "John Harden has Bachelor Degree.");
Person p6 = new Person(*(long)5*, "Jane", "Harden", 2000, "Jane Harden has Master Degree.");
Person p7 = new Person(*(long)5*, "John", "Christopher", 1000, "John Christopher has Bachelor Degree.");
Person p8 = new Person(*(long)5*, "Jane", "Christopher", 2000, "Jane Christopher has Master Degree.");
Person p9 = new Person((long)6, "John", "Bush", 1000, "John Bush has Bachelor Degree.");
Person p10 = new Person((long)3, "Jane", "Bush", 2000, "Jane Bush has Master Degree.");
Person p11 = new Person((long)3, "John", "Gay", 1000, "John Gay has Bachelor Degree.");
Person p12 = new Person((long)3, "Jane", "Gay", 2000, "Jane Gay has master Degree.");
personCache.put(p1.key(), p1);
personCache.put(p2.key(), p2);
personCache.put(p3.key(), p3);
personCache.put(p4.key(), p4);
personCache.put(p5.key(), p5);
personCache.put(p6.key(), p6);
personCache.put(p7.key(), p7);
personCache.put(p8.key(), p8);
personCache.put(p9.key(), p9);
personCache.put(p10.key(), p10);
personCache.put(p11.key(), p11);
personCache.put(p12.key(), p12);
//irrelevant cache to interfere AffinityKey
IgniteCache<Long,String> addCache=ignite.getOrCreateCache("addCache");
addCache.put((long)1, "1");
addCache.put((long)2, "2");
addCache.put((long)3, "3");
addCache.put((long)4, "4");
//this pair has the same value with the orgId of person6-person8
addCache.put((long)5, "5");
addCache.put((long)6, "6");
开始时,我启动了一个节点,它显示:
local size PERSON with aff : 12
local size ORG with aff : 5
local size add with aff : 6
然后,我启动了另一个节点,它显示:
local size PERSON with aff : 9
local size ORG with aff : 5
local size add with aff : 5
结果显示,person6-person8 已与该对搭配 - (5,&#34; 5&#34;),我从逻辑上不想这样做。
我认为AffinityKey就是这样的:它搜索所有缓存,找出一个与AffinityKey.key()具有相同密钥的对,并将它们并置在一起。
例如:我想将A与B并置,然后编写代码
AffinityKey<Integer> key=new AffinityKey<>(A.id,B.id);
但是C与B具有相同的id,与B根本没有任何关系;
如果恰好有缓存B
IgniteCache<Integer,B>
并缓存C
IgniteCache<Integer,C>
然后我不知道哪一个会与A搭配。
总之,我该怎么做才能避免这个问题呢? AffinityKey如何在地球上运作?我很困惑。
先谢谢你的建议!!!
答案 0 :(得分:1)
将密钥映射到节点的工作方式如下:
使用Affinity Key时,Ignite不会搜索所有缓存。只需将密钥转换为亲和关系函数,就会传递关联密钥(在您的情况下代替人员ID,组织ID将被传递)。在这种情况下,来自一个组织的所有人都将映射到同一个分区和组织。如果分区相同,那么节点也将是相同的。
在您的情况下,所有缓存都具有相同的亲和功能(我猜它的RendezvousAffinityFunction具有默认设置),密钥具有相同的类型(长),因此来自addCache和personCache的条目(亲和关键字用于亲和关系)功能即组织ID)具有相同密钥的缓存映射在相同的节点上。您可以删除关联密钥,并查看具有相同密钥的组织和人员(例如1L)将映射到同一分区,从而映射到节点。
有关它的更多详细信息,您可以在那里找到https://apacheignite.readme.io/docs/affinity-collocation