Java 内存数据网格 Hazelcast 3.0 支持连续查询和条目处理

  • Srini Penchikala
  • 马德奎

2013 年 10 月 21 日

话题:JavaDevOps语言 & 开发架构AI

Java 开源内存数据网格Hazelcast的最新版本支持“条目处理(Entry Processing)”、多线程执行、连续查询和延迟索引。Hazelcast 3.0 在两周前的 JavaOne 会议期间发布,体现了该产品自 2008 年创建以来的最大变化,以及改写其 70-80% 的代码所做出的努力。它还使用服务提供程序接口(SPI)重新实现了所有现有的分布式对象,如 Map、Queue 和 ExecutorService 等。

借助多线程执行这一新特性,操作现在可以由多个线程执行(由处理器内核因子确定),这有助于在多核机器上进行扩展。新 SPI 允许开发新的分区服务和数据结构。所有 Hazelcast 数据结构,如 Map、Queue,均使用 SPI 进行了重新实现。

Hazelcast 3 的其它技术特性包括:

条目处理:Hazel cast 3 有一个称为条目处理的新特性,使开发人员可以对 Map 进行快速内存操作,而无须担心锁或并发问题。EntryProcessor是一个可以修改或替换映射条目值的接口。它既可以作用在单个映射条目上,也可以作用在所有映射条目上。未来版本还会增加使用 Predicate 选择目标条目的支持,如“查找和替换”。EntryProcessor 可以与 Hazelcast 的另一个新特性一起使用:内存格式设置。在默认情况下,条目值存为字节数组(二进制格式),但当它存为对象(对象格式)时,条目处理器可以直接作用在该对象上。EntryProcessor 的另一个特性是,它可以自动取得映射条目的独占访问,而无须使用同步来防止更新丢失。

序列化:作为现有序列化方法的一种替代方法,Hazelcast 提供了 Portable 序列化接口。该接口有许多优点,如相同对象类型的多版本支持和不依赖于反序列化和 / 或反射的查询和索引支持。Hazelcast 还提供了 IdentifiedDataSerializable 接口,它是 DataSerializable 接口的略微优化版本,不使用类名和反射进行反序列化。Hazelcast 还允许开发人员插入自定义的串行器用于对象序列化。

连续查询:特性允许程序员设置查询,这些查询会在 addition/update/remove/evict 事件中的任何数据与其相匹配时触发。这一过程由侦听器完成。侦听器使用查询进行注册,并在 Map 条目发生了与查询相匹配的变化时获得通知。在支持诸如复杂事件处理(CEP)这样的情况时,这很有用,而此类情况通常需要单独的产品支持。

延迟索引:借助延迟索引这一新特性,开发人员无须每次在开始阶段就添加索引,而是可以在任何时候为条目添加索引。

分布式事务:Hazelcast 3 支持两阶段提交的分布式事务。新事务 API 同时支持 1- 阶段(本地)和 2- 阶段事务。

InfoQ 就新版本的特性与 Hazelcast 的共同创建者 Fuad Malikov 进行了交谈。

InfoQ:在新版本中增加分布式事务支持的动机是什么?与关系数据库中的 2PC 事务相比,它在内存数据网格中是如何工作的?该特性有什么限制吗?

Fuad我们听取了很多来自社区的建议。Hazelcast 用户要求 Hazelcast 提供 2 阶段提交(2PC)事务的能力。例如,他们希望能够在一个分布式队列中消费一个数据项,对其进行处理,然后将一个条目存入另一个分布式 Map 中。这整个过程需要在一个事务中完成,这样,在节点失败时,才不会丢失未处理的数据。

Hazelcast 是完全的内存解决方案,在默认情况下,它依赖多节点内存复制实现持久性。2PC 的实现也是如此。在准备状态,它就在多个节点上复制事务状态。

另外,Hazelcast 的下一个版本将能够通过 JCA 以及 JMS 和 JDBC 等其它资源参与 XA 事务。

InfoQ:对于 Hazelcast v3 中的连续查询特性,您可以解释下它的工作原理吗?

Fuad在这些特性中,这是另一个使人们认识到内存数据网格不仅仅是缓存的特性。连续查询提供了便利和分布式处理能力这一“存储过程”由来已久的思想,但它与现代复杂事件处理(CEP)模式更为类似。与数据库存储过程不同的是,在 Java 中,连续查询可以保证应用层中应用逻辑的清晰。除此之外,它还具有其它优点,包括有极高的可扩展性,以及能够保证在数据所在的位置对其进行处理,从而使这一过程非常快速和高效。

连续查询的实现结合了 Event 和 Predicate API。Hazelcast 支持 EntryListener,该侦听器监听在 Map 条目上进行的 ADDED、UPDATED、REMOVED 或 EVICTED 等操作。在先前的版本中,它就可以监听所有的 Map 条目或者特定的 Key。除此之外,借助连续查询特性,开发人员可以定义查询(Predicate),而只有更新的条目与该查询匹配时才会触发事件。通过这种方式,侦听器会收到一个基于查询的连续的事件流。

InfoQ:在 Hazelcast 的下一个版本中,有什么开发人员可以期待的新特性和功能增强吗?

Fuad为了创建 Hazelcast 3,它 70-80% 的代码都重写了,这使我们能够支持一些主要架构的模块化。在下一个版本里,其中一个真正令人兴奋的特性是服务提供程序接口(SPI)。我们将 Hazelcast 内部构件分成 Networking、Clustering、Partitioning 和 Service 等四个模块。这些内部构件将暴露为 SPI,因此社区可以对 Hazelcast 进行扩展和开发自定义的分布式数据结构和处理服务。另一个特性是可移植客户端协议。该协议使开发人员可以用任何语言实现客户端。我们会发布 C++ 客户端,并期待由社区来实现其它语言的客户端,如 Python 和 Ruby。

Hazelcast 3 遵循 Apache 2 许可协议,可以从其产品网站上下载。

查看英文原文:Java In-Memory Data Grid Hazelcast 3.0 Supports Continuous Queries and Entry Processing

JavaDevOps语言 & 开发架构AI