Spring Reactive Redis:如果发布者或订阅者不在同一台机器上运行,PubSub将无法运行

问题描述

我有两个在两个不同虚拟网络上的两个不同VM中运行的spring boot服务。 一种服务在运行,并将通知推送到Azure RediscCache中的通道。

Optional<Long> hasMessageSent = redisStringTemplate.convertAndSend(syncQueue,GSON.toJson(data))
            .onErrorReturn(-1L).blockOptional(Duration.ofMinutes(BLOCK_MINUTES));
if (!hasMessageSent.isPresent() || hasMessageSent.get() < 0) {
   LOG.warn("Unable to send the sync message.");
   return false;
}

第二个服务订阅了上述频道以接收通知。

public void subscriberToChannel() {
    LOG.debug("Subscribing to channel " + syncQueue);

    redisTemplate.listenToChannel(syncQueue).name("SYNCQUEUER").doOnNext(msg -> {

    LOG.debug("New message received: '" + msg.toString());

    buildOrUpdateNotifications(getNotification(msg.getMessage()));

}).doOnError(e -> LOG.error("Error while listening at the channel,will continue.",e)).subscribe();

}

如果发布者和订阅者都在同一台计算机上运行,​​则上述设置可以正常工作。 当我将发布者即第一项服务移至VM时;用户,即第二服务已停止接收消息。

我从redis控制台中可以看到,发布者确实将消息推送到频道,但订阅者没有收到消息。

我可以确认在所有情况下,发布者和订阅都连接到相同的Azure Redis缓存实例。

尽管我想知道订户不接收消息是没有道理的,但是我这里缺少什么吗?频道对其运行的网络有任何限制吗?

解决方法

好吧,这不是一个确切的答案,但是您可能想知道Redis将“ mychannel”和mychannel视为两个不同的通道-一个带引号的通道,另一个带不带引号的通道。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...