2017-07-24 53 views
1

我的Spring应用程序由十几个微服务组成。每个微服务提供的数据并不经常变化。为了减少微服务之间的沟通,我正在考虑开始使用Hazelcast。如何配置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

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:在这种情况下,每个成员都维护地图中所有数据的完整副本,因此读取总是本地的。如果你的数据集适合每个成员的内存,并且你的用例大部分是读取的,你可以考虑这个数据结构。