Apache Cassandra的高级Java客户端选择

时间:2011-03-08 11:58:21

标签: java jpa cassandra jdo datanucleus

有四个高级API可以访问Cassandra,我没有时间尝试全部。所以我希望找到一个可以帮我选择合适人选的人。

我会写下我对他们的发现:

DataNucleus将-卡桑德拉-插件

的优点:

  • 支持JPA1,JPA2,JDO1 - JDO3 - 我在评论中看到,JDO比使用JPA的Hibernate更好地扩展
  • kundera中提到的所有专业人士?

缺点:

  • 到现在为止没有对JDO的执行(当然只与我有关;)
  • 未找到文档!

昆德拉

的优点:

  • 具有所有优点的JPA 1.0注释(标准符合,没有样板代码,......)
  • 承诺在不久的将来推出以下功能:JPA听众,@ Preersers @PostPersist等 - 关系,@ OneToMany,@ ManyToMany等 - 交易支持,@ Transactional

缺点:

  • 插件的早期开发阶段?
  • 错误?
  • 无法解决JDO / JPA框架中的问题?

s7 pelops

的优点:

  • 纯java api - >更好地控制持久性?

缺点:

  • 纯java api - >样板代码

hector 0.7

的优点:

  • Maven化
  • spring integration - >依赖注入
  • 纯java api - >更好地控制持久性?
  • jmx monitoring?
  • 管理节点似乎很容易和灵活

缺点:

  • 纯java api(无注释) - >锅炉板代码

到目前为止的结论

由于我对RDMS,Hibernate,JPA,Spring以及对EJB不再那么了解有信心,我的第一印象是,去kundera本来是正确的选择。但在阅读了一些有关JPO,DataNucleus的帖子后,我不再确定了。由于DataNucleus的学习曲线应该是陡峭的(对于经验丰富的JPA开发人员来说?),我不确定,我是否应该去实现它。

我主要担心的是插件的状态。还有JDO和Datanucleus-Cassandra-Plugin的论坛支持/帮助,因为据我所知,它并没有广泛传播。

是否有人在那里,谁有经验,有一些framworks已经可以给我一个提示?也许混合策略也是有意义的。如果(如果存在的话)JDO不灵活/足够/不足以满足我的需求,那么回归到一个更容易的pelops或hector的API?这可能吗?是否有类似于JPA的方法来获取SQL连接和获取/放置数据?


在阅读了一下后,我发现了以下附加信息:

  

Datanucleus-Cassandra-Plugin基于pelops,也可以访问以获得更大的灵活性,更高的性能(?),这应该用于具有大量数据的列族,JDO / JPA访问应该只是用于“管理”数据,其中性能不是那么重要,数据量不是很大。

这仍然让问题开始于hector或pelops。

以后的Datanucleus-Cassandra-Plugin扩展性,或者 hector for it对节点hanldling的支持更充分。

7 个答案:

答案 0 :(得分:9)

我尝试了大多数这些解决方案并找到了最好的解决方案。即使你有一些问题,你总能找到在freenode的#cassandra中编写hector的人。就我而言,代码更加成熟。在cassandra客户端中,最关键的部分是连接池管理(因为所有客户端通过thrift执行大多数相同的操作,但连接池是使高级客户端滚动的原因)。在那种情况下,我会投票给hector,因为我现在在生产中使用它超过一年没有明显的问题(我发现并发送一封电子邮件后立即修复了1个重新连接问题)。

我仍在使用cassandra 0.6。

答案 1 :(得分:7)

datanucleus插件的作者Todd Nine现在正致力于Hector的下一代JPA支持。

答案 2 :(得分:3)

Hector客户端是我们选择的API,因为它具有以下功能:

  • 连接池(共享与节点的连接时获得巨大的性能提升)
  • 使用大多数所有内容的界面完成自定义配置。
  • 自动发现主持人
  • 自定义负载平衡策略定义(LeastActiveBalancingPolicy或RoundRobinBalancingPolicy或实现LoadBalancingPolicy)
  • Thrift API顶部的轻量级适配器。
  • 很棒的例子:见hector-examples
  • 内置JMX支持。

赫克托耳的下行:

  • 文档不错,但Java Docs缺乏一点。这可能很容易成为用户社区的Git fork / pull请求。
  • ORM支持有点限制,但在我们的案例中并不紧急。我无法让一些一对多关联轻松工作,加上缺乏描述什么类型的Cassandra模型(关联集合的超级列或列族)。还缺少Java示例(可能有一些,如果你找到一些请发布)。

另外,我尝试使用kundera但收效甚微。使用或尝试的示例不多,很少有论坛支持。它似乎由一个人维护,这使得选择这样的工具变得更加困难。它似乎基于SVN活动而转移到使用Hadoop或支持它。

答案 3 :(得分:2)

我建议你试试Kundera-2.0.1。它自成立以来发生了重大变化,我看到许多新功能被添加并且错误被修复。目前它支持JPA 1.0和Cassandra 0.7.6,但他们计划很快增加对Cassandra 0.8和JPA 2.0的支持。这里有一个很好的例子:https://github.com/impetus-opensource/Kundera/wiki/Getting-Started-in-5-minutes

答案 4 :(得分:2)

昆德拉2.0.4发布。

此版本中的主要更改:

  • 跨数据存储持久性(很容易通过nosql缩小现有的mysql应用程序)
  • 支持关系数据库(例如Mysql等)
  • 用基于lucene的索引替换solandra。
  • 为双向关联添加了支持。
  • 性能改进修复。

答案 5 :(得分:2)

我也会提议Astyanax,我正在努力,我很高兴。只有文档不是很好。

  

Astyanax API

     

Astyanax实现了一个流畅的API,可以指导调用者缩小或缩小   通过一组定义良好的接口自定义查询。我们也是   包括一些将有效执行和近距离执行的食谱   到尽可能低级别的RPC层。客户也很沉重   使用泛型和重载几乎消除了需要   指定序列化程序。   API的一些主要功能包括:

     
      
  • 键和列类型在ColumnFamily类中定义   无需指定序列化程序。
  •   
  • 同一键空间中的多列族键类型。基于注释的复合列名称。
  •   
  • 自动分页。
  •   
  • 可识别令牌的并行化查询。
  •   
  • 每个操作的可配置一致性级别。
  •   
  • 每个操作的可配置重试策略。
  •   
  • 将操作固定到特定节点。
  •   
  • 使用Futures进行单次超时的异步操作。
  •   
  • 基于简单注释的对象映射。
  •   
  • 操作结果返回主机,延迟,尝试次数。
  •   
  • 跟踪记录自定义事件的接口,以确定操作失败和成功。
  •   
  • 优化批量突变。
  •   
  • 完全隐藏来电者的时钟,但提供挂钩以进行自定义。
  •   
  • 简单的CQL支持。
  •   
  • RangeBuilders,用于简化构建简单列和复合列范围。
  •   
  • 复合构建器,用于简化复合列名称的创建。
  •   
     

食谱一些常见用例的食谱:

     
      
  • CSV导入器。
  •   
  • JSON导出器,可将任何查询结果转换为广泛的JSON   自定义。
  •   
  • 并行反向索引搜索。
  •   
  • 密钥唯一约束验证。
  •   

http://techblog.netflix.com/2012/01/announcing-astyanax.html

答案 6 :(得分:2)

您可以尝试Achilles,这是我开发的新实体管理器,支持所有CQL3功能。

  • 实体映射
  • JPA样式操作
  • 对加入的有限支持
  • 使用复合主键映射群集实体
  • 查询(本机,键入,切片)
  • 支持计数器
  • 支持一致性级别
  • TTL&时间戳
  • JUnit 4启动嵌入式Cassandra服务器以进行测试的规则

    还有更多......

    有两种实施方式: Thrift &的 CQL

    Thrift 版本依赖于 Hector

    CQL 版本从Datastax中为所有操作提取全新的 Java驱动程序核心

    快速参考here