代码之家  ›  专栏  ›  技术社区  ›  munish

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

  •  5
  • munish  · 技术社区  · 6 年前

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

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

    此外,我还了解到aerospike的批处理get在内部并发/顺序地向服务器发出单个请求。

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

    如果aerospike的默认批处理有效,或者我必须做其他事情,请提出建议。

    2 回复  |  直到 6 年前
        1
  •  4
  •   pgupta    6 年前

    批量读取是正确的方法。结果将按照列表中指定的键的顺序返回。未找到的记录将返回null。客户端通过节点并行化密钥-等待(与二级索引或扫描不同,客户端中没有回调),并收集所有节点的返回结果,并按原始顺序将其显示回客户端。确保客户端中有足够的内存来保存所有返回的批处理结果。

        2
  •  3
  •   Ronen Botzer    6 年前

    是否为自定义项?

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

    你有两种UDF。第一个是 record UDF ,它仅限于对单个记录进行操作。该记录在UDF执行时被锁定,因此它可以读取或修改数据,但它被沙盒阻止访问其他记录。第二个是 stream UDF ,它是只读的,并针对查询或命名空间或集的完整扫描运行。它的目的是允许您实现聚合。即使您一次检索1000个密钥,使用流UDF仅从更大的集合或命名空间中拾取一批密钥也是非常低效的。除此之外,UDF总是比Aerospike提供的本机操作慢,这对于任何数据库都是如此。

    批量读取

    阅读文档了解 batch operations ,特别是 batch-index 协议社区论坛中有一对很好的常见问题解答,您应该阅读:

    容量规划

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