【问题标题】:Redis - Max Subscriptions/Connections?Redis - 最大订阅/连接数?
【发布时间】:2018-01-13 22:20:45
【问题描述】:

我正在使用 Redis 和 WebSockets(使用 sockJS 和 STOMP)设计一个基于 Java Spring 的实时通知系统和聊天系统。要求每个用户订阅一个唯一的频道(频道名称将是用户 ID)。这是因为通知可以针对单个用户,并且聊天对话可以是一对一的。我使用redis的真正原因是在用户通过WebSocket连接的相应应用程序服务器(有很多)中触发事件。据我了解,当发布碰巧说“user1”时 - 如果我想为该目标用户触发“onMessage 处理程序”:

  1. 我需要为每个用户维护 1 个 redis 连接吗?
  2. 是否可以一次打开 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


【解决方案1】:

既然你已经用 Redisson 标记了这个问题,我想你已经在使用它了。如果你选择的 WebSocket 框架很灵活,即不限于 SockJS 和 STOMP,你可以考虑netty-socketio 项目。是Redisson的作者写的,两者的结合再自然不过了。

Netty-socketio 与流行的 SocketIO 客户端 JS 库完全兼容,并被许多公司用于商业。

它不需要每个用户一个 redis 连接,并且已知有些人的使用量已经超过了您的要求。

这在项目的 README 文件中有所提及。

2014 年客户反馈:

“为了对解决方案进行压力测试,我们同时运行了 30,000 个 websocket 客户端,并设法以每秒约 140,000 条消息的速度达到峰值,平均延迟不到 1 秒。” (c) Viktor Endersz - Kambi Sports Solutions

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 2021-11-04
    • 2017-05-30
    • 2013-01-18
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多