[Cassandra教程] (八)Java API 进阶 – 异步IO

0.引言


在MySQL之中,我们经常使用的一个查询语句就是 where in。 在Cassandra之中也有这个查询语句。但是如果我们在where in 之中的需要查询的条件比较多的时候,我们就需要使用Cassandra 提供的异步 IO API (async io)接口。

在本文之中,我们将回答下面3个问题:

1.什么是异步IO

2. 为什么需要使用异步IO替换where in

3. 异步IO 性能如何

原文链接:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-async-io/

1. 什么是异步IO,怎么用?


Cassandra之中的异步IO,可以类比为javascript之中的Ajax请求。 即在当前进程之中另外开一个线程去做其他的事情,并且起一个监听器。 当请求有结果返回的时候,再将结果合并到主线程之中。

Cassandra之中的异步IO并不是自己从头开始做的,而是基于Google Guava的Future API。 (笔者也是了解到Guava Future API 之后才知道JDK之中也有Future 接口。谁是谁的father,笔者没有追究过。)

我们来举一个实际的例子,可能这样更容易理解一点:

首先我们看看使用where in 来查询playlists相关数据:

然后我们对比着看一下使用异步IO 是如何来操作的:

因为WordPress编辑器里面来编写代码讲解不太方便,所以直接将重要的说明都写到了代码注释之中。

可以看到,使用异步IO之后,代码量与代码复杂度都增加了不少。 如果只是简单查询,完全没有必要使用这种方式。 那什么情况下需要使用异步IO呢?

原文链接:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-async-io/

2. 当查询条件非常多的时候需要使用异步IO


这里从https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/ 借了两幅图:

where in 的方式:

 

async io 方式:

 

简单的说:

当使用where in 并且查询条件很多的时候, 我们的连接点(contact point) 压力会比较大。 因为由contact point 到各个节点去查找,并且将结果集进行汇总。 如果其中任何一步发生异常(比如timeout)整个查询过程就挂了。或者当查询条件过多的时候,很可能就把contact point 挤爆了!

当使用异步IO的时候,是并发的向各个节点发出查询请求。 主要的压力在client。并且如果其中一个查询失败,还会自动重复这个查询,其他查询不需要重新执行。 client通过并发数的控制,也控制了压力不会暴增~

可以看到,使用异步IO的方式,对client – cluster 之间的网络压力还是有点大的。 但是整体的稳定性来说应该是要稳定一些。 毕竟并发数是可控的。 这个异步查询只是基于Future API 做了多线程同步,并且在使用难度上,也不是非常大~

原文链接:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-async-io/

3. 异步IO 性能如何


关于异步IO的性能,笔者其实没有进行过对比测试。 我们的一个需求是:

每天都会有用户上传的数据, 每个用户都有一个UUID。
我们会去检查是否已经由这个UUID的数据,如果有,执行plan A, 否则 plan B.

个人认为,这种需求会非常非常多,在业界应该也非常普遍。 我们的查询量级在400W ~ 500W 之间。 目前并没有实际的查询QPS 数据~ 后面有机会会做一个详细的性能测试, 只是目前,几百万的查询对我们来说应该在几分钟之内就全部完成了。

我们的 集群:

8台 i7 + 32G + HDD 服务器。 对很多大公司来说,其实并不是非常庞大的集群,但是就查询来说,完全可以满足我们的需求

原文链接:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-async-io/

本文为原创文章,转载请注明出处

点赞
  1. cassan说道:

    怎么是8台 i7? Cassandra 不是推荐奇数节点吗?

    1. rangerwolf说道:

      刚放假回来。 回复晚了。。。

      这个事情有点意思, 一开始我们只有5台机器做启动。 然后新的一个季度, 老板觉得还不错, 直接批了3台新机器的预算。 反正我不用白不用,多几台也不是坏事

      哈哈

发表评论

电子邮件地址不会被公开。 必填项已用*标注