Infinispan에서 cluster내에 entries들을 분산하는 것은 consistent hashing algorithm에 근거하여 이루어진다. 이 algorithm은 entry의 key를 사용하여 hash를 계산하고, 어느 node가 primary owner인지, 나머지 node들이 backup owner로 동작할 것인지 결정하는데 hash를 사용한다. 분산에 대해 제어하는 것은 가능하다. 특히, performance 때문에 grouping algorithm을 사용하여 연관된 entry들을 동일 node상 같은 장소에 배치하는 것은 아주 유용하다. 이것 때문에 우리는 key 기반 group name을 계산할 수 있는 Grouper class를 생성할 필요가 있다. 예제는 다음과 같다.
public static class LocationGrouper implements Grouper<String> {
@Override
public String computeGroup(String key, String group) {
return key.split(",")[1].trim();
}
@Override public Class<String> getKeyType() {
return String.class;
}
}
위의 코드는 아주 간단하다. 단지 key를 comma를 delimiter로 사용하여 분리하고, 두번째 항목 ("country")을 group으로 사용한다. Hashing algorithm은 key 대신에 group을 사용하여 entry의 hash를 계산할 것이다. 특정 grouper를 사용하기 위해서는 configuration에 추가해야 한다.
config.clustering().hash().groups().enabled().addGrouper(new LocationWeather.LocationGrouper());
이제 application을 실행해 보자.
git checkout -f step-8
mvn clean package exec:exec # from terminal 1
mvn exec:exec # from terminal 2
이번 실행에서 각 node별로 output을 조사해보면 동일한 country에 속한 모든 entry에 대한 event log가 "paired"되어 있음을 볼 수 있을 것이다. 내 경우에는 "Romania" group이 두번째 Node에 "hashed"되었다.
[Coordinator Output]
-- Entry for Bucharest, Romania
modified by another node in the cluster
-- Entry for Cluj-Napoca, Romania modified by another node in the cluster
다음 단계에서는 node간에 전송된 entry들을 serialized form으로 어떻게 제어하는지를 살펴볼 것이다.
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/675