在 aerospike 中实现批量读取的最佳方式

Best way to implement batch reads in aerospike

我有一个场景,对于每个请求,我必须批量获取至少 1000 个密钥。

目前我每分钟收到 2000 个请求,预计会增加。

我还读到 aerospike 的批量获取在内部向服务器 concurrently/sequentially 发出单独请求。

我将 aerospike 用作集群(运行 在 SSD 上)。因此,在 lua 中编写 UDF(用户定义的方法)以发出批处理请求并在服务器级别聚合结果而不是来自客户端的多次点击是否有效

请建议 aerospike 的默认批量获取是否有效,或者我必须做其他事情。

批量读取才是正确的做法。结果按列表中指定的键的顺序 returned。未找到的记录将 return 为空。客户端按节点并行化密钥 - 等待(与二级索引或扫描不同,客户端没有回调)并从所有节点收集 returns 并以原始顺序将它们呈现回客户端。确保您的客户端有足够的内存来保存所有 returned 批处理结果。

使用 UDF 还是不使用 UDF?

首先,您不能将批量读取作为 UDF,至少不能以任何远程有效的方式进行。

你有两种UDF。第一个是 record UDF, which is limited to operating on a single record. The record is locked as your UDF executes, so it can either read or modify the data, but it is sandboxed from accessing other records. The second is a stream UDF,它是只读的,针对名称空间或集合的查询或完整扫描运行。它的目的是让你实现聚合。即使您一次检索 1000 个密钥,使用流 UDF 仅从更大的集合或命名空间中挑选一批密钥也是非常低效的。除此之外,UDF 总是比 Aerospike 提供的本地操作慢,这对任何数据库都是如此。

批量读取

阅读 batch operations, and specifically the section on the batch-index 协议的文档。您应该阅读社区论坛中的一对常见问题解答:

容量规划

最后,如果您的应用程序每秒收到 2000 个请求,并且每个请求都变成了 1000 个键的批量读取,您需要确保您的集群大小合适以处理 2000 * 1000 = 2Mtps 读取。调整 batch-index 参数会有所帮助,但如果您没有足够的聚合 SSD 容量来支持每秒 200 万次读取,您的问题是 capacity planning 之一.