2017-08-06 53 views
0

我正在设计一个基于Java Spring的实时通知系统&使用Redis的聊天系统& WebSockets(带有sockJS和STOMP)。要求是为每个用户订阅一个唯一的频道(频道名称将是用户ID)。这是因为通知可以针对单个用户,聊天对话可以是1对1。使用redis的im的原因是为了获得用户通过WebSocket连接的相应应用程序服务器(有很多)触发的事件。据我了解,当发生公布说“USER1” - 如果我想要得到的“的onMessage处理程序”解雇只是目标用户:Redis - 最大订阅数/连接数?

  1. 我需要保持每用户1个Redis的连接?
  2. 可以一次打开15k个连接,并且可以同时连接到系统的许多用户使用15k独特订阅吗?
+0

系统如何知道用户连接哪个应用程序服务器知道用户有新消息或者您正在询问什么? – goblinjuice

+0

系统知道,因为Redis将在用户连接到的相应应用程序服务器中触发事件处理程序。假设用户-a连接到appserver-a,用户-b连接到appserver-b。当我向两个用户订阅的频道发布消息时,redis将在两个应用服务器中触发事件,并且在事件处理程序中,我有代码通过用户连接的websocket将消息发送给用户。 – user1220169

+0

我的问题是这样的。在用户-a订阅channel-a和user-b到channel-b并且他们两个都连接到同一个应用服务器的情况下 - 我需要为每个用户分配两个到redis的连接。因此,当我向user-a发布消息时,事件仅在连接时触发 - a用户a的eventHanler正在侦听,而user-b由于他/她通过完全独立的连接进行连接,因此未收到此消息。我需要知道这是否是一个好方法。 – user1220169

回答

0

既然你用Redisson标记了这个问题,我想你已经在使用它了。如果您选择的WebSocket框架是灵活的,即不限于使用STOMP的SockJS,您可以考虑netty-socketio项目。它由Redisson的作者撰写,两者之间的整合不可能更加自然。

Netty-socketio与广受欢迎的SocketIO客户端JS库完全兼容,它被许多商业公司所使用。

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

这是在项目的自述文件中提到的。在2014年

客户反馈:

“进行压力测试,我们运行30个000同时WebSocket的客户端和管理在具有小于1秒的平均延迟总每秒约140 000的消息的到峰值的解决方案”。 (c)Viktor Endersz - Kambi体育解决方案