Hazelcast – 常见陷阱和性能提示

Hazelcast – 常见陷阱和性能提示


单机上的 Hazelcast 队列

Hazelcast 队列存储在单个成员上(以及不同机器上的备份)。这实际上意味着队列可以容纳可以在一台机器上容纳的尽可能多的项目。因此,队列容量不会通过添加更多成员来扩展。加载比机器在队列中可以处理的数据更多的数据可能会导致机器崩溃。

使用 Map 的 set 方法而不是 put

如果我们使用 IMap 的 put(key, newValue),Hazelcast 会返回 oldValue。这意味着在反序列化上花费了额外的计算和时间。这还包括从网络发送的更多数据。相反,如果我们对 oldValue 不感兴趣,我们可以使用返回 void 的 set(key, value)。

让我们看看如何存储和注入对 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成员拥有同等的资源实力是必要的。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁