У меня есть кластер с несколькими наборами реплик. Я хочу вызвать какую-то хранимую функцию на всех узлах без вычисления Bucket_id, а затем сопоставить результаты. Как я должен это делать?
Широковещательный вызов Tarantool
Ответы (2)
Вы можете использовать модуль cartridge.rpc функция get_candidates
для получения всех нод с той или иной ролью, которую вы хотите вызвать и после использовать модуль cartridge.pool function 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
в виде карты с ключами: строка, имя_класса, err, файл, подошибки, строка
person
Gennady
schedule
30.05.2020
Еще одно предложение.
Если вы используете vshard и хотите выполнить уменьшение карты по хранилищам:
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
person
Oleg Babin
schedule
04.06.2020