在 Aerospike 中,是否可以使用 UDF "chain gets"?
In Aerospike, is it possible to "chain gets" with a UDF?
我在文档中看到示例,其中可以获取记录或一组记录流,并执行某些操作。我想获取一条记录,从该记录中检索一个标识符,在另一组中查找该标识符,然后 return 来自第二组的 bin 的内容。它实际上是一个连接,例如
function chained_get(rec)
if aerospike:exists( rec ) then
local other_id = rec.other_id
-- how to return the result of: 'SELECT some_bin FROM namespace.some_bin WHERE PK = other_id'
end
return result
end
我意识到这在 client/application 方面很容易做到,但我想尽可能避免网络 'chatter' 和 Aerospike 中的 'chain' get 请求。
这可能吗?
简短的回答是否定的,Aerospike 服务器不支持这种由服务器本身主动参与的连接(现在?)。但是对于近单个 round-trip 延迟有解决方法:
分布式数据库中的连接问题是其他记录可能位于集群中的另一个节点上。但是,根据您尝试执行的操作,您很可能可以使用 Aerospike 提供的其他工具来执行此操作。例如,一个强大的功能是二级索引功能。你可以例如有一个用户和一组订单(记录)。为了避免必须先查找用户然后对所有订单发出批处理获取,您可以发出用户获取和一个查询,该查询将所有具有用户 id = xyz 的记录放入并行索引并合并到 client-side。缺点是所有节点都会收到一个查询,因为它不知道订单位于何处,并且每个二级索引条目需要大约 45-70 字节的 RAM。但是,您应该对这是否比您的 2 round-trip 替代方案表现更好进行基准测试,因为它取决于查询的优先级、二级索引大小等..
如果这种方法可以解决您的问题或您有什么要求,请告诉我,我们可以帮助您实现这一目标。如果您同时尝试两者,添加基准测试结果可能会很有趣。
记录 UDF 无法访问其他记录,流 UDF 只能处理从扫描中流入的记录或作为二级索引查询匹配的结果。 JOIN 可以在 application-side 上实现。
我在文档中看到示例,其中可以获取记录或一组记录流,并执行某些操作。我想获取一条记录,从该记录中检索一个标识符,在另一组中查找该标识符,然后 return 来自第二组的 bin 的内容。它实际上是一个连接,例如
function chained_get(rec)
if aerospike:exists( rec ) then
local other_id = rec.other_id
-- how to return the result of: 'SELECT some_bin FROM namespace.some_bin WHERE PK = other_id'
end
return result
end
我意识到这在 client/application 方面很容易做到,但我想尽可能避免网络 'chatter' 和 Aerospike 中的 'chain' get 请求。
这可能吗?
简短的回答是否定的,Aerospike 服务器不支持这种由服务器本身主动参与的连接(现在?)。但是对于近单个 round-trip 延迟有解决方法:
分布式数据库中的连接问题是其他记录可能位于集群中的另一个节点上。但是,根据您尝试执行的操作,您很可能可以使用 Aerospike 提供的其他工具来执行此操作。例如,一个强大的功能是二级索引功能。你可以例如有一个用户和一组订单(记录)。为了避免必须先查找用户然后对所有订单发出批处理获取,您可以发出用户获取和一个查询,该查询将所有具有用户 id = xyz 的记录放入并行索引并合并到 client-side。缺点是所有节点都会收到一个查询,因为它不知道订单位于何处,并且每个二级索引条目需要大约 45-70 字节的 RAM。但是,您应该对这是否比您的 2 round-trip 替代方案表现更好进行基准测试,因为它取决于查询的优先级、二级索引大小等..
如果这种方法可以解决您的问题或您有什么要求,请告诉我,我们可以帮助您实现这一目标。如果您同时尝试两者,添加基准测试结果可能会很有趣。
记录 UDF 无法访问其他记录,流 UDF 只能处理从扫描中流入的记录或作为二级索引查询匹配的结果。 JOIN 可以在 application-side 上实现。