Spring Reactive Redis:如果发布者或订阅者不是来自同一台机器 运行,则 PubSub 无法工作
Spring Reactive Redis: PubSub does not work if the publisher or subscriber does not run from the same machine
我在两个不同虚拟网络上的两个不同虚拟机中有两个 spring 启动服务 运行。
一项服务 运行 开启并将通知推送到 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 视为两个不同的频道 - 一个带引号,另一个不带引号。
我在两个不同虚拟网络上的两个不同虚拟机中有两个 spring 启动服务 运行。 一项服务 运行 开启并将通知推送到 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 视为两个不同的频道 - 一个带引号,另一个不带引号。