我有一个场景,对于每个请求,我都要批量获取至少1000个密钥。
目前我每分钟收到2000个请求,预计会有所增加。
此外,我已经读过,批量获取的aerospike内部会同时/顺序地向服务器发出个别请求。
我使用aerospike作为集群(在SSD上运行)。因此,在lua中编写UDF(用户定义的方法)以进行批量请求,并在服务器级别聚合结果而不是从客户端多次点击,这是非常有效的
请建议,如果默认批量获取aerospike将是有效的,或者我做其他事情。
答案 0 :(得分:4)
批量阅读是正确的方法。结果按列表中指定的键的顺序返回。未找到的记录将返回null。客户端通过节点并行化密钥 - 等待(客户端中不存在与二级索引或扫描不同的回调)并从所有节点收集返回并按原始顺序将它们呈现在客户端中。确保客户端有足够的内存来容纳所有返回的批处理结果。
答案 1 :(得分:3)
要UDF还是不要UDF?
首先,您不能将批量读取作为UDF进行,至少不能以任何方式远程高效。
您有两种UDF。第一个是record UDF,仅限于在单个记录上运行。记录在UDF执行时被锁定,因此它可以读取或修改数据,但是通过访问其他记录来进行沙盒处理。第二个是stream UDF,它是只读的,并且针对命名空间或集合的查询或完整扫描运行。其目的是允许您实现聚合。即使您一次检索1000个密钥,使用流UDF从更大的集合或命名空间中选择一批密钥也是非常低效的。除此之外,UDF总是比Aerospike提供的本机操作慢,对任何数据库都是如此。
批量阅读
阅读batch operations的文档,特别是batch-index协议的相关部分。您应阅读社区论坛中的一对常见问题解答:
容量规划
最后,如果您在应用程序中每秒获得2000个请求,并且每个请求变成批量读取1000个密钥,则需要确保您的群集大小合适以处理2000 * 1000 = 2Mtps读取。调整批处理索引参数会有所帮助,但如果您没有足够的聚合SSD容量来支持每秒200万次读取,您的问题就是capacity planning 之一。