Java 数据网格规范:JSR-347

  • Rick Hightower
  • 王丽娟

2011 年 11 月 15 日

话题:Java语言 & 开发架构

JSR-347 是数据网格规范。和 JSR-107(JCache)相比,这个 JSR 的应用场景生来就有争议,容易被混淆。InfoQ 有幸采访了Manik Surtani,了解了他对JSR-347和 JSR-107 的看法,以及他对缓存、NoSQL、数据网格、Infinispan 及相关主题所持的观点。

Manik 是 JSR-347 规范的领导者,并长期参与 JBoss Cache 和 JBoss Infinispan 的开发和维护,这两个项目分别是领先、开源的 Java 缓存实现和数据网格实现。Infinispan 数据网格项目开始于 2009 年 4 月,宣布开始之前,Manik 至少花费了四个月时间去实现数据网格的原型。Infinispan 受到了 JSR-347 的启发,Infinispan 里的很多功能特性都是 JSR-347 目前所建议的。

InfoQ:JSR-347 要达到什么目标?这些目标和 JSR-107 相比有何不同?

JSR-347 也称为针对 Java 平台的数据网格,大家建议 JSR-347 能统一 API、编程模型,分布式的预期行为,还有容错的内存键值存储。它在很多方面都和 JSR-107(针对 Java 平台的临时缓存)有所不同:

  1. 数据持久性。JSR-347 想借助它固有的分布式特性记录存储,从而提供耐久性。JSR-107 则假设存储起来的数据是临时而短暂的。
  2. 分布式。JSR-107 允许实现可以是分布的,JSR-347 则要求实现必须分布。因此,标准可以为用户提供更丰富的 API,以便用户更好地利用数据存储。比如说,只有知道实现是分布式的时候,暴露那些能控制数据在网格里存储位置的 API,异步和非阻塞的 API,还有那些最终支持相容实现的 API 才有意义。
  3. Map/Reduce 和分布式的代码执行。当数据跨网格分布的时候,把代码移到数据中执行有时候要比其他方式更有意义。JSR-347 也会为这些功能提供标准的 API。

InfoQ:已经签署协议去实现 JSR-347 的供应商有哪些?Gemfire 和 Coherence 为什么还没参与到 JSR-347 里呢?

到目前为止,专家组包括 Red Hat、Gigaspaces 和 GridGain。Oracle 和 IBM 通过法律审批后才会正式签署协议,不过他们都表示有兴趣。

Manik 接着说,他希望 Oracle 的 Coherence 团队能参与到 JSR-347 里来,Coherence 团队已经表示有兴趣了,现在正在走内部流程,然后才会正式签署协议。他还说,JSR-347 团队已经联系了 Gemfire,但 Gemfire 还没有反馈。

InfoQ:JBoss Cache 是怎样演进的?JBoss Cache 如何演变成了 Infinispan?

JBoss Cache 是我们搭建 JBoss 应用服务器集群的工具包。我们用它来实现 HTTP 和 EJB 会话的集群,还有一个具备事务特性的 Hibernate/JPA 二级缓存。

Manik 解释说,开发人员接着把 JBoss Cache 当作具备永久存储功能的数据网格来用。由于 JBoss Cache 并不是设计成数据网格的,所以才创建了 Infinispan。Infinispan 既能替代 JBoss Cache 作为集群工具包,也能提供更加强大的数据网格功能。

InfoQ:假定 JBoss 应用服务器的用户默认用 Infinispan 做会话复制,那有多少 JBoss 用户会真正使用 Infinispan 所有的数据网格功能呢?假如 JSR 还没有针对缓存或分布式缓存的标准接口,又有多少 JBoss 用户会真正用 Infinispan 去做分布式缓存或数据网格呢?

这很难说。JBoss 应用服务器和 Infinispan 都是开源项目,我们已经明确区分了社区所作的事情,还有他们怎样和 Infinispan 交互。如果用户论坛和 IRC 上的问题能作为依据,我看大部分人的问题是如何在 JBoss 应用服务上部署的 Web 应用或 EJB 里直接使用 Infinispan 的 API。不过提问的也只有这些人。

InfoQ:什么能定义数据网格解决方案?是查询、事务、从缓存读、写入缓存、数据分片、数据复制还是 Map/Reduce 等其他内容呢?数据网格必须支持哪些功能?

我的回答自然有些主观,但我认为数据网格需要提供事务、读取、写入、某些形式的分片或分区,还有监听器。查询和 Map/Reduce 是更高级的功能,不过大家很快就会期望数据网格能具备这两个功能,所以我们觉得它们也该添加到功能列表里。

InfoQ:你怎么定义 Infinispan 的 Map/Reduce?为什么它对 Java 开发人员来说很重要?

在处理跨大量服务器的分布式数据时,Map/Reduce 本身就是个很重要的概念,因为它有更高的 CPU 和内核利用率,同时能减少网络流量。

Infinispan 的Map/Reduce 在概念上和 Google 最初的概念非常接近,但在实现上,我们遵循流畅 API、人类易读和直观接口的原则,还有现代 Java API 设计的通用最佳实践。因此,和Hadoop 等其他 Java Map/Reduce 实现不同,我们觉得 Infinispan 的实现要更为直观、对开发人员更加友好。

InfoQ:Infinispan 会成为 JSR-347 的参考实现吗?

不会。参考实现需要 Apache 的许可,而 Infinispan 则使用了 LGPL 许可。

InfoQ:我发现 Infinispan 支持 Memcached 的文本 Wire 协议,这是为什么呢?

我们支持 Memcached 的 Wire 协议,最初是想让非 Java 平台接受我们。Memcached 有非常多的客户端库,几乎针对所有的平台。支持 Memcached 的 Wire 协议就意味着差不多所有系统都能使用 Infinispan。

随后我们设计并实现了 Hot Rod,用它来替换 Memcached 的 Wire 协议,编写完这个“可参考的”Java 客户端后,我们就发现社区为 Python 和 Ruby 构建了 Hot Rod 客户端。

Manik 接着解释说,Memcached 的协议对数据网格解决方案来说太过简单,因为它使用请求 / 响应方式,完全是客户端 / 服务器模式。相反,Hot Rod 允许服务器连接客户端,把后端拓扑结构的变化推送给客户端,这对弹性来说至关重要,可以在运行时增加新的数据网格节点。Hot Rod 以后的版本会添加事件处理,Manik 说这会开辟一个充满机遇的世界。尽管 Memcached 的 Wire 协议针对分布式缓存,但 Hot Rod 似乎能突飞猛进,成为事实上的数据网格标准 Wire 协议

InfoQ:和 Oracle Coherence、Enterprise EhCache、VMWare Gemfire 的特性相比,JSR-347 或 Infinispan 的功能怎么样?

刚刚提及的产品已经支持了为 JSR-347 规划的大部分功能。主要区别在于特定 API 本身。当然这并不全面,有些产品可能不具备某些功能,比如 Map/Reduce,但他们也许有能添加缺失功能的组件。

InfoQ:JSR-347 是个 NoSQL 解决方案规范么?相应的,Infinispan 是不是 NoSQL 解决方案?无论是或与否,原因又是什么呢?要成为一个 NoSQL 规范,JSR-347 还缺少哪些功能?

JSR-347 是个标准。它不是个 NoSQL 标准,只是个数据网格标准。Infinispan 会实现 JSR-347,所以它只是个数据网格,不过 Infinispan 也在不断发展,会添加更多 NoSQL 的特性。照目前的情况看,NoSQL 和数据网格之间的差距很小;Infinispan 只是进一步去缩小这种差距。

Manik 接着解释说,JSR-347 是个成熟的 NoSQL 规范,而且不同寻常的是,它是关注 Java 的先行者。

最大的区别在于平台独立性。JSR-347 仍然是个 Java 规范,而很多 NoSQL 数据库则超越了 Java 平台。

InfoQ:查询是 JSR-347 的一部分吗?

这需要专家组去决定。

InfoQ:你是怎样界定数据网格、NoSQL、对象缓存的?

我觉得对象缓存是把对象暂时存储在内存里,检索或计算会很费劲。数据网格把这种做法深入了一步,借助其有弹性、分布式的特性,数据网格提供了一定程度的耐久性。NoSQL 则采用了另一种做法,NoSQL 通常用磁盘存储作为主要的存储引擎,但提供了弹性和可伸缩性,至少在分布式 NoSQL 引擎的情况下是这样的。

InfoQ:对 NoSQL 实现来说,最重要的特性是什么?

在我看来,最重要的特性是可伸缩的弹性。否则的话,你还不如使用 RDBMS,毕竟你早熟悉了它的安装和使用。

InfoQ:从设计来说,Inifinispan 和竞争对手(Coherence、Enterprise EhCache、GemFire)有什么区别?

我不知道专利产品内部是如何设计的。

InfoQ:能描述下 Inifinispan 的设计理念么?

可插拔和可扩展性是关键。我们期望人们能用 Infinispan 去做任何事情,而不仅仅成为按我们描述的使用模式去操作的最终用户。用户在某些情况下可以动态添加拦截器、命令和行为。作为开源软件,代码和设计都是透明的,这样人们就很容易去扩展 Infinispan。

Manik 接着介绍了学习 Infinispan 和 JSR-347 的一些方式。Infinispan 的下一个版本 5.1.0 最近会发布测试版本。要看 JSR-347 是如何进展的,JSR-347 的 Wiki是个好去处。还有一些关于 Inifinispan 和 CDI 集成的视频,Inifinispan 和 CDI 的集成是规范最先做的一部分。他解释说,你可以使用Infinispan 的 Maven 原型快速开始一个项目,并看看 JSR-347 是什么样子。

查看英文原文:Java Data Grid Specification: JSR-347

Java语言 & 开发架构