
本文介绍了 Aerospike 中的查询如何允许应用程序将查询结果作为记录流进行处理、对结果进行分页、对查询进行分区以实现并行性以及稍后恢复执行。
记录流

查询结果作为记录流返回到应用程序。这对于所有查询请求和类型都是如此,包括简单和基于分区、同步和异步、短和长,以及带和不带 UDF。一个例外是后台查询,它实际上是后台更新,因此不会返回任何结果。
由于查询可以与表达式过滤器结合使用,因此它提供了对满足任何条件的记录的流访问。

查询执行

客户端库以分散-收集的方式执行查询:它将查询请求并行发送到多个集群节点,收集响应,并将组合结果返回给应用程序。
虽然在查询执行过程中涉及所有必需的服务器节点,但并非所有节点同时参与查询执行。策略参数 max-concurrent-nodes 控制最大并发节点数。
同样,来自服务器节点的所有结果也不会一起返回。客户端库通过指定要返回的最大记录数来以块的形式从服务器节点请求结果。每个节点返回指定(或更少)数量的记录,以及标记处理中当前位置的光标或标记,以及在后续请求中恢复处理的位置。请注意,查询是使用索引(主索引、集合索引或辅助索引)进行处理的,索引在内部由分布记录的数据分区组织。分区游标处理分区索引中的位置,它们不受记录是否更改以及如何更改的影响。
在处理查询结果时,应用程序可以:
读取并处理流中的所有记录。
从流中部分读取,并迭代请求,直到读取所有记录。每次迭代都从分区游标继续。
从流中部分读取,保存游标状态,并稍后通过使用保存的游标状态提交查询在不同的编程上下文中恢复它。
应用程序还可以随时停止处理结果。可以按照交互式教程中的代码示例进行操作。

同步和异步请求

同步请求
在同步查询请求中,查询返回流句柄。在同一线程中,应用程序从流中读取记录。
异步请求
在异步模式下,流中的每条记录都通过注册的回调类中的方法返回到应用程序。该类实现了三个方法:
处理每条记录
在流结束时通知成功完成
随时通知失败
回调函数在与请求线程不同的单独线程中调用。
可以在此处查看同步和异步请求代码示例。
交互式教程中的代码示例:https://developer.aerospike.com/tutorials/java/query_streams同步和异步请求代码示例:https://developer.aerospike.com/tutorials/java/query_streams#secondary-index-query

分区查询

应用程序可以更好地控制:
流,通过将流分成指定的块。
并行处理,通过将范围限制为分区的子集,并将查询处理分散到多个工作线程上,其中每个工作线程负责特定的分区子集。
这些功能可以通过新的查询分区 API 实现。更简单但功能较少的查询 API 检索最大数量的记录,但无法获取后续块或指定分区。
分页
可以以较小的块重复请求查询结果,直到返回所有结果。一次检索特定数量的记录的能力称为分页。它可以保护应用程序不被大量结果淹没,并且结果缓冲区空间不被占用。返回的结果数可以小于请求的记录数。
使用相同的查询语句和分区过滤器从流中获取下一页记录。Partition-filter 具有 is-done API 来检查是否还有更多记录需要从流中读取。
特定分区
查询分区请求提供了选择特定分区的能力,以便应用程序可以控制如何在多个工作线程上分配工作以获得所需的并行性级别,每个工作线程在其分配的分区上处理查询。API 允许选择单个分区、一系列分区或所有分区。客户端库确定保存所请求分区的节点,并向它们发送相应的子查询。
分区游标
查询过滤器对象提供 get-partitions 调用来获取分区游标。分区游标标记相应分区中的点,查询请求将从这些点恢复。游标状态可用于另一个查询请求以恢复处理。
细粒度并行性
可以以比分区更细的粒度定义查询。我们在博客文章《在细粒度并行流中处理大型数据集》中对此进行了讨论。
分页查询示例:https://developer.aerospike.com/tutorials/java/query_streams#pagination特定分区示例:https://developer.aerospike.com/tutorials/java/query_streams#parallelism-with-query-partitions分区查询示例:https://developer.https://developer.aerospike.com/tutorials/java/query_streams#resuming-a-queryaerospike.com/tutorials/java/query_streams#parallelism-with-query-partitions博文关于细粒度并行流中处理大型数据集https://developer.aerospike.com/blog/parallel-streams

查询不能做什么

变更数据查询
查询不在变更数据捕获 (CDC) 流上运行。使用相同分区过滤器的后续查询请求将不会返回此后满足查询条件的所有新记录。它仅返回上一个查询中光标位置之后出现的任何新记录。这意味着自上次请求以来可能不会返回任何更改、部分更改或所有更改。
订购或直接访问
查询结果的顺序对于应用程序来说并不重要。任何排序顺序都必须在应用程序内计算,并且在排序之前必须检索所有结果。同样,不支持直接访问流中特定位置的记录;应用程序必须首先检索所有先前的记录。
总结

查询构成任何数据库的核心功能。本文介绍了 Aerospike 应用程序可用的一些关键查询功能,例如如何将查询结果作为记录流进行处理、对结果进行分页、对查询进行分区以实现并行性以及如何在稍后恢复查询执行。

·END·
关于Aerospike
1
Aerospike实时数据平台:使组织能够面对数十亿笔交易规模时实时采取行动,同时将服务器占用空间减少多达80%。
2
Aerospike多云平台:以可预测的亚毫秒级性能为实时应用程序提供支持,数据规模高达PB级,正常运行时间为5个9,并提供全球分布的、强一致的数据存储能力。
3
基于Aerospike实时数据平台构建的应用程序:可用于打击欺诈、面向在线电子商务进行商品推荐、支持全球数字支付等,并为数千万客户提供超个性化的用户体验。
公司总部位于加利福尼亚州山景城,在伦敦、班加罗尔和特拉维夫设有办事处,目前已在中国开展业务。
猛戳左下角“阅读原文”,既可以下载社区版本,也可以随时提问。欢迎添加小编微信:Aerospike_China,帮你解决更多问题。




