java - 绝地武士 许多订阅者

标签 java redis jedis

我正在用 java 构建一个推送服务器,并计划使用 Redis PubSub 对消息进行排队以发送到客户端。

现在我的实现每台设备都有一个 redis 订阅者。因此,当设备上线时,它将为其设备订阅 Redis 队列。

这个规模可以吗/有更好的方法吗?我将拥有数千名订阅者。

最佳答案

每台设备一个订阅者应该可以正常工作。我认为扩展问题主要围绕着您到底要向每个订阅者发布什么内容以及消息实际存在的位置。您可能还需要考虑在某个时刻运行多个 Redis 实例(可能由 Redis Sentinel 管理),以确保高可用性。如果主服务器不可用,Redis Sentinel 将处理将您的从属 Redis 实例之一提升为主服务器,然后在原始主服务器恢复并 catch 时将其提升回主服务器。

如果消息对于每个订阅者来说都是唯一的,那么将消息发送给每个订阅者似乎是一个好方法。请注意,redis 中的 pub/sub 不提供持久性,因此,如果我的订阅者断开连接或崩溃或发生任何其他情况并返回,则自他上次订阅以来发送的所有消息都对他不可用。如果您需要持久性,那么消息可能应该发送到每个订阅者的列表,并且在 channel 上发布的内容应该只是通知客户端有新消息可用。然后订阅者可以在闲暇时从列表中弹出任何消息,直到列表为空。每当 channel 收到通知时,都会重复此过程。

如果一条消息被广播到所有或许多客户端,那么您可能应该考虑将消息本身存储在 Redis 键或列表或其他内容中,并在每个受影响的客户端的 channel 上发布新消息可用以及在哪里(什么键)读取它。您可以使用多种策略来跟踪哪个订阅者阅读了哪些消息并删除每个人都阅读过的旧消息。

关于java - 绝地武士 许多订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958489/

相关文章:

java或php用于开发数据库驱动的android应用程序

java - 如何让 printf %x 类似于 python

java - 在php中获取从Java发送的 header 和内容

spring - org.springframework.core.convert.ConverterNotFoundException : No converter found capable of converting from type to type [java. lang.String] - Redis

python - Redis 中 TransactionDB 的 getRange 等价物是什么?

java - 如何使用带有 Stripes "option"标签的对象列表?

c# - 带有 Redis 的 OutputCache 在 Localhost 上工作,但不在 Azure WebApp 上工作

redis - 管理redis数据的最佳方式

php - 如何指示 predis 在出现错误时继续

java - 使用 RedisTemplate 从 Redis 获取 Set 值