Hazelcast - 常見陷阱與效能技巧



單機 Hazelcast 佇列

Hazelcast 佇列儲存在單個成員上(以及不同機器上的備份)。這意味著佇列可以容納一臺機器所能容納的任意數量的項。因此,新增更多成員不會擴充套件佇列容量。如果在佇列中載入超過機器所能處理的資料量,可能會導致機器崩潰。

使用 Map 的 set 方法而不是 put

如果我們使用 IMap 的 put(key, newValue),Hazelcast 會返回 oldValue。這意味著,在反序列化上花費了額外的計算和時間。這也包括從網路傳送更多資料。相反,如果我們對 oldValue 不感興趣,我們可以使用 set(key, value),它返回 void。

讓我們看看如何儲存和注入對 Hazelcast 結構的引用。以下程式碼建立了一個名為“stock”的對映,並在一個地方新增 Mango,在另一個地方新增 Apple。

//initialize hazelcast instance
HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();

// create a map
IMap<String, String> hzStockTemp = hazelcast.getMap("stock");
hzStock.put("Mango", "4");

IMap<String, String> hzStockTemp2 = hazelcast.getMap("stock");
hzStock.put("Apple", "3");

但是,這裡的問題是我們兩次使用了 getMap("stock")。雖然此呼叫在單節點環境中看起來無害,但在叢集環境中會造成緩慢。getMap() 函式呼叫涉及到對叢集中其他成員的網路往返。

因此,建議我們將對對映的引用儲存在本地,並在操作對映時使用該引用。例如 -

// create a map
IMap<String, String> hzStock = hazelcast.getMap("stock");
hzStock.put("Mango", "4");
hzStock.put("Apple", "3");

Hazelcast 使用序列化資料進行物件比較

正如我們在前面的示例中看到的,需要注意的是,Hazelcast 在比較鍵時不會使用反序列化物件。因此,它無法訪問我們在 equals/hashCode 方法中編寫的程式碼。根據 Hazelcast,如果兩個 Java 物件的所有屬性的值相同,則這些鍵相等。

使用監控

在大型分散式系統中,監控起著非常重要的作用。使用 REST API 和 JMX 進行監控對於採取主動措施而不是被動反應非常重要。

同構叢集

Hazelcast 假設所有機器都是平等的,即所有機器都具有相同的資源。但是,如果我們的叢集包含一臺效能較低的機器(例如,記憶體較少、CPU 能力較低等),那麼如果計算發生在該機器上,就會導致速度變慢。更糟糕的是,較弱的機器可能會耗盡資源,從而導致級聯故障。因此,Hazelcast 成員必須具有相同的資源能力。

廣告

© . All rights reserved.