宣布Hazelcast 3.7通用可用性


我非常自豪地介绍Hazelcast的最新版本。如此多的测试和非常高的标准意味着每个版本都是一个重要的里程碑。

有了这个版本,我们进行了重大的结构改进,比如完全实现了我们的模块化战略,并且真正显著地提高了性能——比Hazelcast 3.6快了30%。当你已经是市场上最快的内存数据网格时,这是一件大事。但这还不是故事的结尾。

就模块化而言,现在Hazelcast的许多方面都有独立的回购、maven模块和发布周期。每个client/languageplugin现在是一个模块。当您下载3.7发行版时,它包含最新发布的版本。但是我们可以比Hazelcast核心更快地发布更新、新特性和错误修复。当我们在这个博客中说我们将发布某物与3.7并行,我们的意思是我们正在发布一个模块。它加快了发展。当然,作为一个开源贡献者更容易做出贡献。

Hazelcast 3.7也是我们“任何应用、任何云、任何时间”战略的实现。在此版本中,我们提供了与两个领先的PaaSes Cloud Foundry和OpenShift的本机集成,这两个产品与我们的模块化云发现和管理插件主机完美结合,为公司提供了适用于任何云、任何环境的完整部署平台。事实上,许多独立软件开发商和公司都发现Hazelcast是一条不可抗拒的途径,可以实现他们基于devops的微服务战略,而这一切都要归功于Hazelcast的核心简单性和灵活性,这使它能够在不增加额外开销的情况下发挥关键的基础架构作用。

最后,我们在3.6中引入的客户端协议正在产生结果:我们刚刚发布了支持的版本PythonNode.js客户。更令人兴奋的是:我们看到我们的用户社区开始试验该协议,他们正在建立独立的客户端。这是最好的开源软件,我们喜欢它!

Hazelcast 3.7是一个公开发布的版本,在Maven存储库中和我们的downloads佩奇。

还有一些特性改进,我也将在这里介绍。

新功能:

定制驱逐政策:在黑兹尔卡斯,你总是可以从LRU或LFU之一设置驱逐政策。但是如果你想要更大的灵活性来满足你的应用程序的定制需求呢?定制驱逐政策正是在这方面有所帮助。我们为我们的地图和JCache实现都实现了自定义驱逐。这里你可以看到一个基于奇数的驱逐者的例子。它与我们的O(1)概率驱逐者一起工作。您只需提供一个比较器,我们就可以选择最佳驱逐候选人。

/**
    * Odd evictor tries to evict odd keys first.
    */
   private static class OddEvictor extends MapEvictionPolicy {


       @Override
       public int compare(EntryView o1, EntryView o2) {
           Integer key = (Integer) o1.getKey();
           if (key % 2 != 0) {
               return -1;
           }


           return 1;
       }
   }

查看完整的代码示例here

容错执行器服务:假设您将可执行文件发送到hazelcast节点,它们需要几个小时才能完成。如果其中一个节点崩溃了,而你不知道任务是否完成了呢?在3.7中,我们介绍DurableExecutorService~. It guarantees至少执行一次semantics. Its API is a narrowing ofIExecutorService~。不像IExecutorService,用户将无法向所选成员提交/执行任务。

区域感知分区组:Hazelcast将提供可用性区域感知分区组配置(AWS)。如果可用,还将为Azure故障域和可用性区域提供分区分组。为了确保提供真正的冗余,备份位于另一个区域。以这种方式提供高可用性。

新的云集成:我们正在发布与3.7版本并行的云铸造和开放转换插件。部署到云铸造和OpenShift的Hazelcast成员将自动发现彼此。此外,您还可以选择连接并使用Hazelcast作为CloudFoundry和OpenShift中的服务。您也可以选择与码头工人一起使用https://hub.docker.com/r/hazelcast/openshift/。查看拉胡尔的以下博客,了解有关使用CloudFoundry Integration

我们还发布了我们的Azure Cloud Discovery Plugin在Azure上运行Hazelcast。哈泽尔卡斯特也将在Microsoft Azure Marketplace六月底之前。留意即将到来的博客。

阿帕奇火花连接器:与3.7版本平行,我们正在发布我们的新插件Hazelcast-火花连接器。根据以下缓存示例,它允许火花使用火花RDD应用编程接口将Hazelcast地图和缓存用作共享RDD缓存。

// read from cache
HazelcastJavaRDD rddFromCache = hsc.fromHazelcastCache("cache-name-to-be-loaded")


JavaPairRDD<Object, Long> rdd = hsc.parallelize(new ArrayList<Object>() {{
    add(1);
    add(2);
    add(3);
}}).zipWithIndex();

// write to cache
javaPairRddFunctions(rdd).saveToHazelcastCache(name);

Java和Scala Spark APIs都受支持。查看模块repo详情。

反应——在3.5和3.6版本中,我们做了艰苦的工作,给Hazelcast增加了背压。Hazlecast内部完全异步。现在我们开始揭露反应式方法。在3.7中,大部分IMAP异步方法加上异步克隆都被添加了。Vert.x-Hazlecast是一个非常流行的组合。Vert.x 3.3.0-CR2具有新的反应式Hazelcast集成,性能更高。反应式方法返回ICompletableFuture它可以接受允许反应式风格的回调。

广域网复制增强(仅限企业):3.7;我们实现了重新同步远程广域网集群的能力。这是为IMap实现的(缓存实现留给3.8)。当您启动广域网连接或需要在维护后重新启动远程群集时,这非常有用。

通过Solace的广域网复制(仅限企业):我们还在Solace中添加了广域网复制,这是一个高性能的企业级消息传递解决方案。

Hazelcast内部构件的显著改进

该版本特别关注一些深层管道,以修复Hazelcast中的一些罕见边缘情况,从而提高正确性。对于那些喜欢阅读血腥细节的人,我精选了一些显著的变化:

  • 分区系统的改进:我们的社区发现了以下问题:在迁移过程中,即使群集中有足够数量的节点,也可能会出现节点数少于配置的备份计数的情况。如果有任何节点在这个不幸的时刻崩溃,我们就会丢失数据。虽然,有些人可能会声称这是一个边缘情况;尽管如此,它还是与我们给用户的保证相冲突。因此,我们在分区和迁移系统中设计并实现了重大改进。您可以在这里找到解决方案的详细说明:https://hazelcast.atlassian.net/wiki/display/COM/Avoid+Data+Loss+on+Migration+-+Solution+Design
  • 优雅的关闭改进:我们需要确保数据安全,同时关闭多个节点。但是有一个相反的例子:当节点关闭时,它会检查其分区的所有第一次备份是否都已同步,而不会检查备份节点是否也正在关闭。这里有一个比赛的情况。如果所有者和备份节点同时关闭,我们会丢失数据,因为所有者不知道第一个备份也正在关闭。请参阅以下公共关系以了解解决方案:https://github.com/hazelcast/hazelcast/pull/7989
  • 对线程模型的改进:在3.7版本中,现在至少有一个通用优先级线程将只处理成员/客户端心跳这样的通用优先级操作。这意味着在负载下,集群保持更稳定,因为这些重要的操作得到处理。有关问题和解决方案的详细信息,请参见以下公共关系:https://github.com/hazelcast/hazelcast/pull/7857
  • 对调用系统的改进:调用服务是我们想要改进和简化的部分之一。因为它很复杂,所以很难修复错误,即使是很小的变化也容易倒退。我们简化了调用逻辑并修复了一些歧义。虽然这是一个完全内部的开发,但是它使Hazelcast更加稳定,避免了许多关于调用系统的问题。相关的各种增强(例如,将IsExecutingOperation移动到它自己的线程中)修复了如下几个问题:https://github.com/hazelcast/hazelcast/issues/6248
  • 我们引入了远程调用的分组和批处理,但是也减少了一些内部垃圾以获得更高的性能。我们的努力导致了高达15%的性能提升,尤其是当参数较大时。如果你想读一些代码,这里是:https://github.com/hazelcast/hazelcast/pull/8023
  • 防止在事务中阻塞读取:为了给事务提供原子性,我们阻塞了对被事务锁定的条目的读取。这不是最佳解决方案。我们更改了体系结构,以便在commit
  • 对热重启和高清(仅限企业高清)的改进:我们引入了批量热重启操作(当启用fsync时),这将显著提高性能。此外,我们通过将值保存到磁盘,减少元数据,优化了热重启的内存使用。在高密度内存中,我们为更安全的内存访问创建了一个抽象层,该抽象层还处理未对齐的内存访问,以便在Solaris系统中常见的Oracle Sparc处理器上启用硬盘。
  • 。网络客户端增强:除了开发新的客户端,我们的团队还在增强现有的客户端。我们为我们的添加了谓词和SSL支持。Net客户端。

新客户

在3.6版发布了客户端协议之后,在我们社区的支持下,我们开始开发新的本地客户端。幸运的是,Python和Node.js客户端现在已经作为支持客户端发布了。查看我们的新客户页面,查看我们的clients and features在每个中实现。

结束语

我们总是需要您的帮助,请尝试3.7并创建您遇到的问题。你可以用我们的forum,推特(@hazelcast)或Stackoverflow回答你的问题;和Github为你的错误报告和贡献。

感谢大家的支持。