You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置POLICY_KEY_SEND后多键batch_apply执行失败的问题排查

批量原子性创建/更新Aerospike记录的问题及解决

需求背景

需要批量原子性地创建或更新一组记录,每个键对应专属数据,已注册UDF用于判断记录存在性并执行对应操作。Aerospike Python客户端的batch_apply方法支持对多键执行函数,但官方示例中所有键共用同一数据,需实现为每个键传入专属数据。

初始尝试及问题

尝试调用batch_apply的代码如下:

data = { k1: d1, k2: d2, k3: d3}
keys = list(data.keys())
asclient.batch_apply(keys, "my_module", "my_function", data)

对应的Lua UDF定义:

function my_function(rec, args)
    if aerospike:exists(rec) then
        pk = record.key(rec)
        data = args[pk]
        -- 使用新旧数据处理记录
        some code for data manipulation
        -- 更新记录
        aerospike:update(rec)
    else
        -- 记录不存在,使用对应键的数据创建
        pk = record.key(rec) -- 记录不存在,返回nil
        data = args[pk] -- 执行失败
        aerospike:create(rec)
    end
end

问题:不存在的记录无法获取主键,导致UDF执行失败。

调整策略后的尝试及新问题

设置policy_batch_apply参数,开启POLICY_KEY_SEND:

data = { k1: d1, k2: d2, k3: d3}
keys = list(data.keys())
asclient.batch_apply(keys, "my_module", "my_function", data, policy_batch_apply={'key': aerospike.POLICY_KEY_SEND})

修改后的Lua UDF:

function my_function(rec, args)
    if aerospike:exists(rec) then
        -- 原有更新逻辑
        ...
    else
        pk = record.key(rec) -- 记录不存在,返回nil
        -- 创建空记录以借助策略存储主键
        aerospike:create(rec)
        -- 此时可获取主键
        pk = record.key(rec)
        data = args[pk]
        -- 设置记录数据
        ...
        -- 更新空记录为实际数据
        aerospike:update(rec)
    end
end

新问题:单键执行正常,但多键批量执行时,Aerospike日志出现警告:

Oct 01 2024 09:19:37 GMT: WARNING (batch): (batch.c:1015) batch must not repeat key
Oct 01 2024 09:19:37 GMT: WARNING (batch): (batch.c:1188) Batch keys mismatch. Expected 2 Received 1

仅第一个键的UDF被执行。查看Aerospike服务器源码发现,设置POLICY_KEY_SEND时会隐式开启REPEAT标志,但官方文档未提及此行为。

更新修复

Python客户端15.0.0版本已修复批量写入时REPEAT标志被自动设置的问题。


内容的提问来源于stack exchange,提问作者jarni-ua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:31:00