Cassandra客户端Java API
我最近开始使用Cassandra数据库。 现在我正在评估哪个Cassandra client
应该继续前进。
我已经看到了关于哪个客户端用于Cassandra的stackoverflow的各种post,但没有一个有非常确定的答案。
我的团队要求我对此进行一些研究, pros and cons
针对Java中的每个Cassandra Client API's
一些pros and cons
。
正如我刚才提到的那样,我最近和Cassandra
所以不知道为什么某些人会selectPelops client
以及为什么有些人会和Astyanax
以及其他一些客户一起去。
我知道每个Cassandra客户的简短事情,我的意思是我能够完成这项工作,并开始阅读和写入Cassandra数据库。
以下是我迄今为止的信息。
CASSANDRA APIS
-
Hector(生产就绪)
最稳定的Java API,准备好黄金时段。 -
Astyanax(The Up and Comer)
来自Netflix的干净的Java API。 它不像赫克托那样广泛使用,但它是坚实的。 -
Kundera(NoSQL ORM)
JPA兼容,当你想通过对象与Cassandra进行交互时,这很方便。
这在某种程度上限制了你不能拥有dynamic数量的列/名称等。但它确实允许您移植ORM,或者将存储集中到Cassandra上以供更传统的使用。 -
贝洛布思
我只是简单地使用了Pelops。 这是一个直接的API,但似乎没有背后的动力。 -
PlayORM(没有约束的ORM?)
我刚刚听说这个。 它似乎试图通过引入JQL来解决传统的基于JPA的ORM和NoSQL之间的阻抗不匹配问题。 看起来很有希望 -
节俭(避开我!)
这是“低级”API。
以下是我们决定Cassandra Client
优先级 –
- 首要任务是:低延迟开销,Asynch API以及生产环境的可靠性/稳定性。
(例如,在包装客户端的DAL中可以具有更加用户友好的API)。 - 连接池和分区意识是其他一些好的function。
- 能够检测到添加的新节点。
- 良好的支持(正如以下院长指出的那样)
任何人都可以提供一些想法吗? 而且每个Cassandra Client
优缺点以及哪个客户端可以满足我的要求也会有很大的帮助。
我相信,主要是我将围绕Astyanax client or New Datastax client that uses Binary protocol
我猜是基于我的研究成果。 但是没有一定的信息来支持我的研究并将其呈现给我的团队。
Astyanax客户端和新的Datastax客户端(使用新的Binary协议)之间的任何比较将有很大的帮助。
在我的研究中对我有很大的帮助,并会从过去使用不同客户的不同人那里得到很多的知识。
节俭越来越成为传统的API:
首先,您应该知道,Thrift API不会获得新function; 它在那里是为了向后兼容,不build议用于新项目。
– 保罗
所以我会避免基于Thrift的API(节俭只是为了向后兼容)。
在说,如果你确实需要使用基于节俭的API,我会去Astyanax。 Astyanax非常易于使用(与其他节俭API相比,但我的个人经验是Datastax的驱动程序更容易)。
所以你应该看看Datastax的 API( 和GitHub 仓库 )? 我不确定是否有可供下载的API的编译版本,但是您可以使用Maven轻松构build它。 另外如果你看看GitHub仓库的提交日志,它会经常更新。
该驱动程序专门用于CQL3,并且是asynchronous的,但要警告Cassandra 1.2是最早支持的版本。
性能
Astyanax是基于节点的,Datastax的驱动器是二进制协议。 这里是我可以find节俭和CQL之间的最新基准 (注意这些肯定是过时的)。 但公平地说,在这些基准testing中performance出来的微小的差异将很less成问题。
asynchronous支持
Datastax的asynchronous支持是Astyanax的一个明显的优势(Netflix 试图实现它,但决定不)。
文档
我真的不能反对Netflix的wiki 。 该文件是优秀的,并更新相当频繁。 他们的wiki包含代码示例,如果您需要在工作中查看代码,则可以在源代码中findtesting。 我努力寻找Datastax驱动程序的任何文档,但是在GitHub存储库中提供了testing,因此这是一个起点。
也看看这个答案 (好吧..不是我的一个反正)它看起来Thrift和CQL的一些优点/缺点。
我会推荐Cassandra的Datastax java驱动http://www.datastax.com 。
对于像JPA支持尝试我的映射工具。 http://valchkou.com/cassandra-driver-mapping.html
注释驱动没有映射文件,没有脚本,没有configuration文件。 不需要DDL脚本。 模式自动与实体定义同步。
用法示例:
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>
我也会增加体面的支持。 我们一直在堆栈溢出上发布playORM的答案;)。 它也即将开始支持mongodb(工作快要结束了),所以任何客户都可以在mongodb或cassandra上运行。 它有它自己的查询语言,这个端口工作得很好。 当真正需要速度的时候,你总是可以访问原始的astyanax界面。
此外,你关于asynch … thrift的说明以前不支持asynchronous,所以没有客户做任何事情,因为他们生成的节俭代码。 既然这个已经改变了,我不知道有一个客户加了异样的东西。
我知道hbase有一个asynchronous的客户端。 无论如何,只是想我会增加我的2美分,以防一点帮助。
编辑:我最近在cassandra节俭生成的源代码,这是不是一个非常好的apiasynchronous发展与发送和recv()方法,但你不知道什么时候调用recv方法。 在cassandra用户名单上的亚伦morton有一个博客,你如何能够真正做到这一点,但它不是干净的…必须从节俭深处抓住select,做一些东西,所以你知道什么时候调用recv方法.. 。漂亮的东西。
后来,院长
我直接使用了Hector,Astyanax和Thrift。 我也使用Python客户端PyCassa。
我发现的重要特征是:
- 易于使用的API
- 复合列支持
- 连接池
- 潜伏
- 文档
其中一个主要问题是获得正确的types。 您希望能够传入long,string,byte []等。Hector和Astyanax都使用Serializer对象来解决这个问题。 在Astyanax你指定他们更高的链,所以你不得不less指定他们。 在Hector中,如果更改模式,语法通常非常笨重,难以适应。
由于Python具有dynamictypes,所以在PyCassa中处理这个问题要容易得多。 既然这不是你的select,我不会多说,但是我发现它最简单(使用),但也很慢。
Hector中的复合柱支撑非常混乱。 Astyanax有注解,极大地简化了这一点。
据我所知,Hector和Astyanax的连接池是一样的。 两者都将避免击倒主机,并发现添加到环中的新主机。 这两个function对可靠性和可维护性至关重要。 Pelops似乎有这些function,但我从来没有尝试过。
Astyanax和Hector之间的一个关键区别是延迟优化。 Astyanax能够将读取和写入请求路由到副本节点,从而避免了额外的networking跳跃。 这可以将延迟减less几毫秒。
最后一眼,Astyanax的文档很差,但现在看起来好多了。
我今天看到的Hector的唯一优势就是使用得更广泛,所以可能更less车。 但是Astyanax具有更好的function集。
我有一个类似Valchkou的build议。 DataStax的java CQL驱动程序,非常好。 我尝试了astyanax,kundera和buffalosw的playorm。 Astyanax是非常低的水平,有些是复杂的。 Kundara和playorm是nosql数据库的通用ORM,安装和启动起来很复杂。
Datastax apis与JDBC驱动程序非常相似,必须将CQL语句embedded到DAO中,并编写几行代码来加载和保存实体。 为了解决这个问题,我编写了一个名为cassandra-jom的java对象映射器,围绕datastax cql驱动程序构build。 Cassandra-jom注释与JPA / Hibernate注释非常相似,甚至可以从对象模型创build/更新列族模式。 它很容易使用和可靠,并在我的其他实时Web应用程序中使用。 在github页面查看它。