Трансляция вызова Tarantool - PullRequest
1 голос
/ 30 мая 2020

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

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Вы можете использовать модуль картридж.rp c функцию get_candidates для получения всех узлов с некоторой ролью, которую вы хотите вызвать, а затем использовать модуль картридж.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 в виде карты с ключами: line, class_name, err, file, suberrors, str

2 голосов
/ 04 июня 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
...