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

问题描述 投票:0回答:2

我的 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 条记录。

提前谢谢您!

hazelcast
2个回答
4
投票

Hazelcast

IMap
是一种分区数据结构:每个条目都映射到一个分区(基于散列其密钥),每个成员都被指定为某些分区的所有者或备份。 您所描述的内容可以通过在您的
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 缓存是条目的本地缓存,并且在

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

您可以考虑的另一种选择是使用

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


0
投票

我对代码结构有疑问,想了解 @Profile("hazelcast") 在 hazelcastConfiguration 中的用法

© www.soinside.com 2019 - 2024. All rights reserved.