设置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
相关产品推荐
相关产品推荐

