如何在 Hazelcast 集群中配置复制缓存?
How to configure replicated cache in Hazelcast cluster?
我的 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 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
:在这种情况下,每个成员都维护映射中所有数据的完整副本,因此读取始终是本地的。如果你的数据集适合每个成员的记忆并且你的用例主要是读取,你可以考虑这种数据结构。
我的 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 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
:在这种情况下,每个成员都维护映射中所有数据的完整副本,因此读取始终是本地的。如果你的数据集适合每个成员的记忆并且你的用例主要是读取,你可以考虑这种数据结构。