Как записать файл сервиса aeropike, чтобы он переподключался в случае сбоя соединения? - PullRequest
0 голосов
/ 20 мая 2019

Мой файл cacheService.js -

const Aerospike = require('aerospike');
const AerospikeConfig = require("../config/aerospike");
const hash = require('object-hash');
const NAMESPACE = AerospikeConfig.NAMESPACE;
const SET_NAME = AerospikeConfig.SET_NAME;
const CONNECTION_CONFIG = AerospikeConfig.CONNECTION_CONFIG;
const logger = require('./logger')(__filename);
const META = { ttl: AerospikeConfig.DEFAULT_TTL }

let client;

function connect() {
    Aerospike.connect(CONNECTION_CONFIG)
        .then(cacheClient => {
            client = cacheClient;
            logger.info(`[connect] Aerospike connected successfully`);
        }).catch(function(err) {
            logger.error(`[connect] Unable to create Aerospike Client, Error: ${err}`);
        });
}

// Write a record
function write(key, value) {
    return new Promise((resolve, reject) => {
        client.put(new Aerospike.Key(NAMESPACE, SET_NAME, hash(key)), value, META, (error) => {
            if (error) {
                logger.error(`[write] Error while writing to cache - ${error}`);
                return reject(error);
            }
            else {
                logger.info('[write] Data written successfully');
                return resolve(200);
            }
        });
    });
}

// Read a record
function read(key) {
    return new Promise((resolve, reject) => {
        client.get(new Aerospike.Key(NAMESPACE, SET_NAME, hash(key)), (error, record) => {
            if (error) {
                logger.info('[read] Record does not exist in cache');
                return reject(error);
            }
            else {
                logger.info('[read] Record found in cache');
                return resolve(record.bins);
            }
        });
    });
}

module.exports = {
    connect: connect,
    write: write,
    read: read
}

Как мне переписать его так, чтобы перед каждым чтением и записью он проверял, подключен ли клиент, а если нет, то подключается, а затем выполняет дальнейшую операцию?

В настоящее время, когда я перезапускаю аэроспайк, операции чтения и записи не выполняются, и мне приходится перезапускать сервис снова.Мне нужно записать его так, чтобы он снова подключался, не прерывая чтение и запись.

1 Ответ

2 голосов
/ 24 мая 2019

Если вы используете многоузловой кластер Aerospike, как и большинство людей, вам не нужно этого делать вообще.Клиент будет знать о ips кластера, и как только узел выпадет, он автоматически будет склоняться к тому, чтобы кластер обнаружил, что ip упал, - затем прекратит связь с ним - или наоборот, если узел добавлен, он будет обнаружен и подключен.к этому.Если вы работаете с многоузловым кластером и сталкиваетесь с этим, изучите функциональность quiesce, которая позволяет изящно удалить узел https://www.aerospike.com/docs/operations/manage/cluster_mng/quiescing_node/index.html

Если вам по какой-то причине необходимо запустить один экземпляр Aerospike,Я не уверен, что вы хотите проверять подключение при каждой операции.Вы можете просто захотеть добавить перехват к исключению, который указывает, что вы не подключены ни к какому активному узлу, и в этом перехвате создать экземпляр клиента и попытаться выполнить операцию снова.Лучшее решение для вашего клиента и данных - запустить многоузловой кластер и использовать режим покоя.

...