我正在java中构建推送服务器,并且我正计划使用Redis PubSub将消息排队以发送给客户端。
现在我的实现每台设备都有一个redis用户。因此,当设备上线时,它将为其设备订阅redis队列。
这是否可以扩展/有更好的方法吗?我会有数千名订阅者。
答案 0 :(得分:2)
每台设备的订户应该可以正常工作。我认为缩放问题主要围绕您向每个订阅者发布的内容以及消息实际存在的位置。您可能还需要考虑在某些时候运行多个redis实例,可能由Redis Sentinel管理,以确保高可用性。如果master不可用,Redis Sentinel将处理将你的一个slave redis实例提升为master,然后在它返回并且赶上时将原始master升级回master。
如果消息对每个订户都是唯一的,那么将消息发送给每个订户似乎是一种好方法。请注意,redis中的pub / sub不提供持久性,因此如果我的订阅者断开连接或崩溃或其他任何内容并返回,则自上次订阅以来发送的所有消息都不可用。如果您需要持久性,那么消息应该可以转到每个订阅者的LIST,并且在通道上发布的内容应该只是通知客户端新消息可用。然后,订户可以在闲暇时从LIST弹出任何消息,直到LIST为空。在通道上收到通知的任何时候都会重复此过程。
如果向所有或许多客户端广播单个消息,那么您应该考虑将消息本身存储在redis密钥或列表或其他内容中,并在每个受影响的客户端通道上发布新消息可用以及在哪里(什么键)阅读它。您可以使用多种策略来跟踪哪个订阅者已阅读哪些消息并删除每个人阅读的旧消息。