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 成员有必要拥有平等的资源权力。