如何在Hazelcast群集中配置复制缓存?

时间:2017-07-24 08:11:01

标签: hazelcast

My Spring应用程序包含十几个微服务。每个微服务提供的数据不会经常变化。为了减少微服务之间的通信,我正在考虑开始使用Hazelcast。

我的想法是每个微服务都会嵌入Hazelcast。微服务在同一个网络中运行,我想Hazelcasts会形成一个集群。每个微服务都会在启动时将其数据放入本地Hazelcast,数据将被复制到集群中的每个其他Hazelcast。当微服务需要从其他微服务加载数据时,它首先会查看本地Hazelcast,并且只有当本地缓存丢失数据时才会进行网络调用。

是否可以使用Hazelcast配置类似的内容?我已经尝试过,但微服务中的数据恰好分布在集群中的所有Hazelcast节点上。

我使用了非常简单的配置:

@Configuration
@EnableCaching
@Profile("hazelcast")
public class HazelcastCacheConfiguration {
    @Bean
    public Config hazelcastConfig() {
        return new Config()
                .setInstanceName("routes-cache")
                .addMapConfig(
                        new MapConfig()
                                .setName("ports-cache")
                                .setEvictionPolicy(EvictionPolicy.LRU)
                ).addMapConfig(
                        new MapConfig()
                                .setName("routes-cache")
                                .setEvictionPolicy(EvictionPolicy.LRU)
                ).setProperty("hazelcast.logging.type", "slf4j");
    }
}

我在Hazelcast管理中心检查了群集中的数据复制。我的样本数据集只有13条记录。微服务已将启动时的13条记录推送到本地Hazelcast,在管理中心我看到群集中有2个节点,一个节点上有9条记录,其他微服务节点上有4条记录。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

Hazelcast IMap是一个分区数据结构:each entry is mapped to a partition (based on hashing its key),每个成员都被指定为某些分区的所有者或备份。 您所描述的内容可以通过在IMap上配置近缓存来完成:

@Bean public Config hazelcastConfig() { NearCacheConfig routesNearCache = new NearCacheConfig("routes-near-cache") .setInMemoryFormat(InMemoryFormat.OBJECT); return new Config() .setInstanceName("routes-cache") .addMapConfig( new MapConfig() .setName("routes-cache") .setEvictionPolicy(EvictionPolicy.LRU) .setNearCacheConfig(routesNearCache) ); // continue with the rest of config here }

near cache是条目的本地缓存,并在IMap之上透明地工作。第一次执行routesCache.get(K)时,将从拥有K映射到的分区的(可能是远程的)成员中获取该条目。然后将该值缓存在本地近缓存中,并且每个后续routesCache.get(K)将在本地提供。近缓存处理失效事件(例如,当某个特定键上发生put时,该键的条目将从每个近缓存中删除),以确保值保持最新。

您可以考虑的另一个替代方法是使用ReplicatedMap:在这种情况下,每个成员都会维护地图中所有数据的完整副本,因此读取始终是本地的。如果您的数据集适合每个成员的内存并且您的用例主要是读取,则可以考虑此数据结构。