Tarantool 广播调用
Tarantool broadcast call
我有几个副本集的集群。我想在所有节点上调用一些存储函数而不计算 bucket_id,然后映射结果。我应该怎么做?
您可以使用模块 cartridge.rpc function get_candidates
for getting all nodes with some role, which you want to call and after to use module cartridge.pool 函数 map_call
来调用您的函数和映射结果。此功能从 1.2.0-17 版本的墨盒可用。所以你的代码可能是这样的:
local cartridge = require('cartridge')
local nodes = cartridge.rpc_get_candidates('my_role_name', { leaders_only = true, healthy_only = true })
local pool = require('cartridge.pool')
local results, err = pool.map_call('_G.my_function_name', { func_args }, { uri_list = nodes, timeout = 10 })
if (err ~= nil) then
#your error handling#
end
所有函数响应都将保存到 results
变量并映射到每个 URI。所有错误都将保存到 err
变量作为映射键:line, class_name, err, file, suberrors, str
另一个提议。
如果您使用 vshard 并希望对存储执行 map-reduce:
local replicaset, err = vshard.router.routeall()
for _, replica in pairs(replicaset) do
local _, err = replica:callrw('function', { args })
if err ~= nil then
return nil, err
end
end
我有几个副本集的集群。我想在所有节点上调用一些存储函数而不计算 bucket_id,然后映射结果。我应该怎么做?
您可以使用模块 cartridge.rpc function get_candidates
for getting all nodes with some role, which you want to call and after to use module cartridge.pool 函数 map_call
来调用您的函数和映射结果。此功能从 1.2.0-17 版本的墨盒可用。所以你的代码可能是这样的:
local cartridge = require('cartridge')
local nodes = cartridge.rpc_get_candidates('my_role_name', { leaders_only = true, healthy_only = true })
local pool = require('cartridge.pool')
local results, err = pool.map_call('_G.my_function_name', { func_args }, { uri_list = nodes, timeout = 10 })
if (err ~= nil) then
#your error handling#
end
所有函数响应都将保存到 results
变量并映射到每个 URI。所有错误都将保存到 err
变量作为映射键:line, class_name, err, file, suberrors, str
另一个提议。
如果您使用 vshard 并希望对存储执行 map-reduce:
local replicaset, err = vshard.router.routeall()
for _, replica in pairs(replicaset) do
local _, err = replica:callrw('function', { args })
if err ~= nil then
return nil, err
end
end