Широковещательный вызов Tarantool

У меня есть кластер с несколькими наборами реплик. Я хочу вызвать какую-то хранимую функцию на всех узлах без вычисления Bucket_id, а затем сопоставить результаты. Как я должен это делать?


person Gennady    schedule 30.05.2020    source источник


Ответы (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