49

我最近开始使用 Cassandra 数据库。现在我正在评估Cassandra client我们应该继续前进的过程。

我在 stackoverflow 上看到过各种关于 Cassandra 使用哪个客户端的帖子,但没有一个给出非常明确的答案。

我的团队要求我对此进行一些研究,并在 Java 中pros and cons为每一个提出一些建议。Cassandra Client API’s

正如我所提到的,我最近参与其中,Cassandra所以不太了解为什么某些人会选择Pelops client以及为什么某些人会与Astyanax其他一些客户一起去。

我了解每个 Cassandra 客户端的简要情况,我的意思是我能够完成这项工作并开始读取和写入 Cassandra 数据库。

以下是我目前掌握的信息。

卡桑德拉·阿皮斯

  • Hector (Production-Ready)
    最稳定的 Java API,为黄金时段做好准备。

  • Astyanax (The Up and Comer)
    来自 Netflix 的一个干净的 Java API。它不像赫克托那样广泛使用,但它很坚固。

  • Kundera (The NoSQL ORM)
    JPA 兼容,当您想通过对象与 Cassandra 交互时,这很方便。
    这在某种程度上限制了您,因为您将无法拥有动态数量的列/名称等。但它确实允许您通过 ORM 移植,或将存储集中到 Cassandra 上以用于更传统的用途。

  • Pelops
    我只简单地使用过 Pelops。这是一个直截了当的 API,但似乎没有它背后的动力。

  • PlayORM(没有约束的 ORM?)
    我刚刚听说过这个。看起来它试图通过引入 JQL 来解决传统的基于 JPA 的 ORM 和 NoSQL 之间的阻抗不匹配。看起来很有希望。

  • Thrift (Avoid Me!)
    这是“低级”API。

以下是我们在决定时的优先事项Cassandra Client-

  • 首要任务是:低延迟开销、异步 API 和生产环境的可靠性/稳定性。
    (例如,可以在包装客户端的 DAL 中拥有更加用户友好的 API)。
  • 连接池和分区感知是其他一些不错的功能。
  • 能够检测到添加的任何新节点。
  • 良好的支持(正如下面的院长所指出的)

任何人都可以提供一些想法吗?每个人的任何利弊以及Cassandra Client哪些客户可以满足我的要求也将有很大帮助。

我相信,主要是我将围绕Astyanax client or New Datastax client that uses Binary protocol我猜想基于我到目前为止的研究。但是没有特定的信息来支持我的研究并将其呈现给我的团队。

Astyanax 客户端和 New Datastax 客户端(使用新的二进制协议)之间的任何比较都会有很大帮助。

这将对我的研究有很大帮助,并且会从过去使用过不同客户的不同人那里获得很多关于这方面的知识。

4

5 回答 5

23

Thrift 正变得更像是一个遗留 API:

首先,您应该知道 Thrift API 不会获得新功能;它的存在是为了向后兼容,不推荐用于新项目。
-保罗

所以我会避免使用基于 Thrift 的 API(thrift 只是为了向后兼容而保留)。

如果您确实需要使用基于节俭的 API,我会选择 Astyanax。Astyanax 非常易于使用(与其他节俭 API 相比,但我个人的经验是 Datastax 的驱动程序更容易)。

所以你应该看看Datastax 的API(和 GitHub repo)?我不确定是否有任何已编译的 API 版本可供下载,但您可以使用 Maven 轻松构建它。此外,如果您查看 GitHub 存储库的提交日志,它会经历非常频繁的更新。

该驱动程序仅适用于 CQL3 并且是异步的,但请注意 Cassandra 1.2 是最早受支持的版本。

性能
Astyanax 是基于节俭的,Datastax 的驱动是二进制协议。以下是我可以在 thrift 和 CQL 之间找到的最新基准(注意这些肯定已经过时了)。但公平地说,这些基准中显示的性能上的微小差异并不重要。

异步支持
Datastax 的异步支持明显优于 Astyanax(Netflix尝试实现它但决定不实现)。

文档
我真的不能反对Netflix 的 wiki。该文档非常好,并且更新相当频繁。他们的 wiki 包含代码示例,如果您需要查看工作中的代码,可以在源代码中找到测试。我很难找到 Datastax 驱动程序的任何文档,但是在 GitHub 存储库中提供了测试,因此这是一个起点。

也看看这个答案(好吧..反正不是我的答案)它研究了 Thrift 和 CQL 的一些优点/缺点。

于 2013-04-13T19:00:59.713 回答
8

我会推荐 Cassandra http://www.datastax.com的 Datastax java 驱动程序。

对于类似 JPA 的支持,请尝试我的映射工具。 http://valchkou.com/cassandra-driver-mapping.html

注释驱动 没有映射文件,没有脚本,没有配置文件。不需要 DDL 脚本。Schema 自动与实体定义同步。

使用示例:

   Entity entity = new Entity();
   mappingSession.save(entity);
   entity = mappingSession.get(Entity.class, id);
   mappingSession.delete(entity); 

在 Maven 中央可用

   <dependency>
      <groupId>com.valchkou.datastax</groupId>
      <artifactId>cassandra-driver-mapping</artifactId>          
    </dependency>
于 2014-01-19T06:13:33.753 回答
3

我也会添加体面的支持。我们一直在堆栈溢出时发布 playORM 的答案;)。它也即将开始支持 mongodb(工作已接近完成),因此任何客户端都可以在 mongodb 或 cassandra 上运行。它有自己的查询语言,因此这个端口工作得很好。当你真的需要速度时,你也总是可以访问原始的 astyanax 界面。

此外,您关于 asynch...thrift 的注释以前不支持 asynch,因此在生成 thrift 代码时也没有客户端支持。由于情况发生了变化,我不知道有哪个客户端添加了异步内容。

我知道 hbase 虽然有一个异步客户端。无论如何,只是想我会加上我的 2 美分,以防它有一点帮助。

编辑:我最近在 cassandra-thrift 生成的源代码中,对于使用 send 和 recv() 方法的异步开发来说,它不是一个很好的 api,但你不知道何时调用 recv 方法。cassandra 用户列表上的 Aaron morton 有一个关于如何真正做到这一点的博客,但它一点也不干净……必须从 thrift 深处抓住选择器并做一些事情,这样你才能知道何时调用 recv 方法。 .相当讨厌的东西。

后来,迪恩

于 2013-04-13T17:42:48.010 回答
2

我直接使用了 Hector、Astyanax 和 Thrift。我还使用了 Python 客户端 PyCassa。

我发现重要且与众不同的功能是:

  • API 的易用性
  • 复合柱支撑
  • 连接池
  • 潜伏
  • 文档

主要问题之一是使类型正确。您希望能够传入 longs、Strings、byte[] 等。Hector 和 Astyanax 都通过使用 Serializer 对象来解决这个问题。在 Astyanax 中,您将它们指定在链的较高位置,因此您不必经常指定它们。在 Hector 中,如果您更改架构,语法通常非常笨拙且难以适应。

由于 Python 具有动态类型,因此在 PyCassa 中处理它要容易得多。由于它不是你的选择,我不会多说,但我发现它最容易使用(到目前为止)但也很慢。

复合柱支持在 Hector 中非常令人困惑。Astyanax 有注释可以大大简化这一点。

据我所知,Hector 和 Astyanax 的连接池是相同的。两者都将避免被击落的主机并发现添加到环中的新主机。这两个特性对可靠性和可维护性都至关重要。Pelops 似乎具有这些功能,但我从未尝试过。

Astyanax 和 Hector 之间的一个关键区别是延迟优化。Astyanax 能够将读取和写入请求路由到副本节点,从而可能避免额外的网络跃点。这可以将延迟减少几毫秒。

最后看一下,Astyanax 的文档很差,但现在似乎有了很大的改进。

我今天能看到的 Hector 的唯一优势是它的使用范围更广,因此错误可能更少。但是 Astyanax 有更好的功能集。

于 2013-04-16T11:47:56.417 回答
1

我有与 Valchkou 类似的建议。DataStax java CQL驱动,很不错。我尝试了 astyanax、kundera 和 buffalosw 的 playorm。Astyanax 的级别非常低,而且有些复杂。Kundara 和 playorm 是用于 nosql 数据库的通用 ORM,设置和入门都很复杂。

Datastax api 与 JDBC 驱动程序非常相似,您必须在 DAO 中嵌入 CQL 语句并编写几行代码来加载和保存实体。为了解决这个问题,我编写了一个名为 cassandra-jom 的 java 对象映射器,它围绕 datastax cql 驱动程序构建。Cassandra-jom 注释与 JPA/Hibernate 注释非常相似,甚至可以从您的对象模型创建/更新您的列族模式。它易于使用且可靠,可用于我的其他实时 Web 应用程序。在其 github 页面上查看。

https://github.com/w3cloud/cassandra-jom

于 2014-10-02T18:14:18.823 回答