2017-08-06 265 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體育解決方案