Как организовать несколько клиентов Redis

Я использую библиотеку redis-sentinel-client для управления подключением к Дозорная группа Redis. У меня проблема в том, что при подключении мне нужно обрабатывать записи, которые могут уже присутствовать или отсутствовать в магазине Redis.

Поскольку у меня два клиента (из-за того, что один является подписчиком), я не уверен, что это лучший способ организовать мои прослушиватели событий, чтобы я гарантировал, что оба клиента готовы, прежде чем пытаться выполнять какие-либо операции.

На данный момент имею следующее:

var sentinelSubscriberClient = RedisSentinel.createClient(opts);
var sentinelPublisherClient = RedisSentinel.createClient(opts);

sentinelSubscriberClient.on('ready', function redisSubscriberClientReady() {
    sentinelPublisherClient.removeAllListeners('ready');

    sentinelPublisherClient.on('ready', function () {
        supportedChannels.forEach(function (channel) {
            sentinelSubscriberClient.subscribe(channel);
        });

        // Includes reading + publishing via `sentinelPublisherClient`
        processUnprocessed();
    });
});

(есть также слушатели error, но я удалил их, чтобы код было легче читать)

Этот текущий подход не работает, если клиент-издатель выдает ready раньше клиента-подписчика. Мой вопрос заключается в том, как я могу организовать прослушиватели событий, чтобы я мог безопасно вызывать .subscribe() на клиенте-подписчике и различные методы (.lrange(), .publish() и т. д.) прослушивателя издателя?

Спасибо!


person jabclab    schedule 03.06.2014    source источник


Ответы (1)


Просто переместите создание клиента в готовую функцию обратного вызова.

var sentinelSubscriberClient = RedisSentinel.createClient(opts);
var sentinelPublisherClient = null;

sentinelSubscriberClient.on('ready', function redisSubscriberClientReady() {
    sentinelPublisherClient = RedisSentinel.createClient(opts);
    sentinelPublisherClient.on('ready', function () {
        supportedChannels.forEach(function (channel) {
            sentinelSubscriberClient.subscribe(channel);
        });

        // Includes reading + publishing via `sentinelPublisherClient`
        processUnprocessed();
    });
});
person Rahar    schedule 03.06.2014
comment
О, отлично, спасибо :-) Думаю, нам просто нужно if (sentinelPublisherClient) вокруг sentinelPublisherClient.removeAllListeners('ready'). - person jabclab; 03.06.2014