【发布时间】:2018-01-13 22:20:45
【问题描述】:
我正在使用 Redis 和 WebSockets(使用 sockJS 和 STOMP)设计一个基于 Java Spring 的实时通知系统和聊天系统。要求每个用户订阅一个唯一的频道(频道名称将是用户 ID)。这是因为通知可以针对单个用户,并且聊天对话可以是一对一的。我使用redis的真正原因是在用户通过WebSocket连接的相应应用程序服务器(有很多)中触发事件。据我了解,当发布碰巧说“user1”时 - 如果我想为该目标用户触发“onMessage 处理程序”:
- 我需要为每个用户维护 1 个 redis 连接吗?
- 是否可以一次打开 15k 个连接并为同时连接到系统的许多用户提供 15k 个唯一订阅?
【问题讨论】:
-
系统如何知道用户连接的是哪个应用服务器,知道有新消息要发送给用户还是您要问的?
-
系统知道,因为 Redis 将在用户连接的相应应用服务器中触发事件处理程序。假设 user-a 连接到 appserver-a,user-b 连接到 appserver-b。当我将消息发布到两个用户都订阅的频道时,redis 将在两个应用服务器中触发一个事件,并且在事件处理程序中,我有代码通过用户连接的 websocket 将消息发送给用户。跨度>
-
我的问题是这个。在用户 a 订阅频道 a 和用户 b 订阅频道 b 并且他们都连接到同一个应用服务器的场景中 - 我需要为每个用户有 2 个单独的 redis 连接。因此,当我向用户 a 发布消息时,事件仅在用户 a 的 eventHanler 正在侦听的连接 a 上触发,并且用户 b 没有收到此消息,因为他/她是通过完全独立的连接进行连接的。我需要知道这是否是一个好方法。
-
另一种方法是每个应用服务器只有一个连接,不断将 eventHandlers 添加到同一个 redis 连接并订阅所有频道。在我的事件处理程序中,我需要检查消息是否针对当前用户,并且仅在为 true 时发送 - 忽略其他用户的消息。问题是所有事件处理程序都将被解雇。但这比每个用户有 1 个连接更好吗?是我想弄清楚的
标签: redis jedis lettuce redisson