2017-07-24 70 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:在這種情況下,每個成員都維護地圖中所有數據的完整副本,因此讀取總是本地的。如果你的數據集適合每個成員的內存,並且你的用例大部分是讀取的,你可以考慮這個數據結構。