我最近开始使用Cassandra数据库。现在我正在评估我们应该推进哪个Cassandra client
。
我在stackoverflow上看过关于哪个客户端用于Cassandra的各种帖子,但没有一个有非常确定的答案。
我的团队已要求我对此进行一些研究,并为Java中的每个pros and cons
提出一定的Cassandra Client API’s
。
正如我所提到的,我最近参与了Cassandra
,所以没有太多想法为什么某些人选择Pelops client
以及为什么某些人选择Astyanax
和其他一些客户。
我知道每个Cassandra客户的简要介绍,我的意思是我能够完成这项工作并开始阅读和写入Cassandra数据库。
以下是我目前所掌握的信息。
CASSANDRA APIS
Hector(生产就绪)
最稳定的Java API,为黄金时段做好准备。
Astyanax(The Up and Comer)
来自Netflix的干净Java API。它没有Hector广泛使用,但它是坚实的。
Kundera(NoSQL ORM)
符合JPA标准,当您想通过对象与Cassandra进行交互时,这很方便
这有点限制了你,因为你将无法拥有动态数量
列/名称等。但它确实允许您移植ORM或集中存储
加入Cassandra以获得更多传统用途。
贝洛布思
我只是简单地使用过Pelops。这是一个直接的API,但似乎没有
有它背后的动力。
PlayORM(没有约束的ORM?)
我刚刚听说过这个。看起来它正试图解决阻抗问题
通过引入JQL,传统的基于JPA的ORM和NoSQL之间不匹配。它看起来
有前途的。
节俭(避免我!)
这是“低级”API。
以下是我们决定Cassandra Client
-
有人能提出一些想法吗?此外,每个Cassandra Client
以及哪个客户可以满足我的要求的任何利弊也将有很大的帮助。
我相信,主要是我将围绕Astyanax client or New Datastax client that uses Binary protocol
旋转我估计到目前为止我的研究基础。但是没有某些信息支持我的研究并将其提交给我的团队。
Astyanax客户端和New Datastax客户端(使用新的二进制协议)之间的任何比较都会有很大的帮助。
在我的研究中对我有很大帮助,并且会从过去使用过不同客户的不同人那里获得很多相关知识。
答案 0 :(得分:23)
Thrift正变得越来越成为传统的API:
首先,您应该知道Thrift API不会获得新功能;它是为了向后兼容,而不是推荐用于新项目。
- the paul
所以我会避免使用基于Thrift的API(只保留thrift以保持向后兼容性)。
说如果你确实需要使用基于节俭的API,我会选择Astyanax。 Astyanax非常易于使用(与其他节俭API相比,但我个人的经验是Datastax的驱动程序更容易)。
因此,您应该查看Datastax's API(and GitHub repo)?我不确定是否有任何已编译的API版本可供下载,但您可以使用Maven轻松构建它。此外,如果您查看GitHub repo的提交日志,它会经常进行更新。
驱动程序专门使用CQL3并且是异步的,但要注意Cassandra 1.2是最早支持的版本。
效果
Astyanax是基于节俭的,Datastax的驱动器是二进制协议。以下是我在thrift和CQL之间可以找到的最新benchmarks(注意这些肯定是过时的)。但公平地说,这些基准测试中显示的性能差异很小。
Asynch支持
Datastax的 asynch 支持比Astyanax(Netflix tried implementing明确优势,但决定不支持)。
文档
我不能反对Netflix's wiki。文档非常好,并且经常更新。他们的wiki包含代码示例,如果需要查看代码,可以在源代码中找到测试。我很难找到Datastax驱动程序的任何文档,但是在GitHub存储库中提供了测试,因此这是一个起点。
另外看一下this answer(好吧......不管怎么说)。它研究了Thrift和CQL的一些优点/缺点。
答案 1 :(得分:8)
我会为Cassandra http://www.datastax.com推荐Datastax java驱动程序。
对于JPA之类的支持,请尝试我的映射工具。 http://valchkou.com/cassandra-driver-mapping.html
注释驱动 没有映射文件,没有脚本,没有配置文件。 不需要DDL脚本。 模式自动与实体定义同步。
使用示例:
Entity entity = new Entity();
mappingSession.save(entity);
entity = mappingSession.get(Entity.class, id);
mappingSession.delete(entity);
可在maven central
上找到 <dependency>
<groupId>com.valchkou.datastax</groupId>
<artifactId>cassandra-driver-mapping</artifactId>
</dependency>
答案 2 :(得分:3)
我也会增加不错的支持。我们一直在堆栈溢出时发布playORM的答案;)。它也即将开始支持mongodb(工作已接近完成),因此任何客户都可以使用mongodb或cassandra。它有自己的查询语言,这样端口工作得很好。当真正需要速度时,你总是可以访问原始的astyanax界面。
另外,你关于asynch ... thrift的说明以前不支持asynch所以没有客户端做了,因为他们生成了thrift代码。由于这已经改变,我不知道有一个客户端已经添加了asynch内容。
我知道hbase有一个异步客户端。无论如何,只是想我会增加2美分,以防它有点帮助。
编辑:我最近在cassandra-thrift生成的源代码中使用send和recv()方法进行异步开发并不是一个非常好的API,但是你不知道何时调用recv方法。 cassandra用户列表上的Aaron morton有一个关于你如何真正做到这一点的博客但它根本不干净......必须从节俭深处抓住选择器并做一些事情让你知道何时调用recv方法.. 。讨厌的东西。后, 迪安
答案 3 :(得分:2)
我直接使用了Hector,Astyanax和Thrift。我还使用了Python客户端PyCassa。
我发现重要且与众不同的功能是:
其中一个主要问题是使类型更正确。你希望能够传入long,Strings,byte []等.Hector和Astyanax都通过使用Serializer对象来解决这个问题。在Astyanax中,您可以在链中指定它们,因此您必须更少地指定它们。在Hector中,如果更改模式,语法通常非常笨重且难以适应。
由于Python具有动态类型,因此在PyCassa中处理它更容易。因为它不是你的选择,所以我不会说太多,但我发现它最容易使用(到目前为止)但也很慢。
Hector中的复合列支持非常混乱。 Astyanax有注释可以大大简化这一点。
据我所知,Hector和Astyanax的连接池是相同的。两者都将避免被击落的主机并发现添加到环中的新主机。这两个特性对可靠性和可维护性至关重要。 Pelops似乎有这些功能,但我从未尝试过。
Astyanax和Hector之间的关键区别在于延迟优化。 Astyanax能够将读写请求路由到副本节点,从而避免额外的网络跳跃。这可以将延迟减少几毫秒。
最后看,Astyanax的文档很差,但现在似乎有了很大改进。
我今天能看到的赫克托耳的唯一优势是它使用得更广泛,所以可能不那么多了。但Astyanax有更好的功能集。
答案 4 :(得分:1)
我和Valchkou有类似的建议。 DataStax java CQL驱动,非常好。我尝试过astyanax,kundera和buffalosw的游戏。 Astyanax水平很低,有些复杂。 Kundara和playorm是nosql数据库的通用ORM,设置和入门都很复杂。
Datastax apis与JDBC驱动程序非常相似,您必须在DAO中嵌入CQL语句并编写几行代码来加载和保存实体。为了解决这个问题,我编写了一个名为cassandra-jom的java对象映射器,它围绕datastax cql驱动程序构建。 Cassandra-jom注释与JPA / Hibernate注释非常相似,甚至可以从对象模型创建/更新列族模式。它易于使用且可靠,并在我的其他实时Web应用程序中使用。在github页面上查看。