2015-10-01 40 views
10

我已經閱讀了很多關於websockets的知識,並且已經在我的系統中實現了它們。這個問題是關於如何正確使用它們。我想以正確的方式實施通知和聊天系統。Websockets Notification-/Chat- System

對於通知,我的信道「的通知/信道」和用於聊天,我的信道「聊天/信道」。

是不是這兩個通道太「全球性」?比方說,當該網站有1.000.000個用戶時,這意味着所有這些用戶都將在這兩個渠道中。當一個通知被髮送給另一個特定用戶時,這意味着該消息通過一個渠道發送,其中1.000.000個用戶訂閱。

與聊天消息一樣。假設用戶想要與其他用戶聊天。每條消息都會通過所有用戶訂閱的通道,最終,只有目標用戶纔會收到由於通過receiver_id而發送的消息。

如何妥善處理通知渠道和「私人」聊天頻道?

難道是更好的性能和安全來爲每個用戶創建一個「子頻道」(羣聊和通知,E.G「通知/渠道/ USER1」),或者只是讓一個大通道的所有用戶?

+0

沒有想法?我認爲這是每個人在網絡套接字時都應該思考的問題,所以必須有一個推薦的方法來實現這一點。 – user3746259

+0

你真的想讓所有的100萬用戶在同一組聊天嗎?否則,您顯然需要將事情劃分爲子組。與通知一樣。除了性能影響之外,並非所有用戶都應該因隱私原因收到所有通知。 – gzost

+0

我不是指在一個大羣體中聊天或發送通知 - 我的意思是在一個大通道中,並將它們轉發給特定用戶。 – user3746259

回答

1

就個人而言,我會解決這個問題的方法如下:

每個用戶都有1個WebSocket連接。該連接將用於傳遞所有數據。我會使用json格式來回傳遞數據。我將使用json結構中的字段來指示消息的類型以及其他信息,如聊天室ID。所以,如果我想發送一個通知,它可能是這樣的(真正簡單的例子):

{ 
    "type":"notification", 
    "message":"New Mail" 
} 

聊天信息會是這樣的:

{ 
    "type":"chat", 
    "chatID":4756, 
    "message":"Hello, world!" 
} 

客戶端JavaScript邏輯將確定消息的類型以及如何處理它。服務器端邏輯將確定用戶是否「訂閱」到指定的聊天室,以便它知道發送給哪個用戶的聊天消息。這將保證它的安全,所以你不會向沒有訂閱房間ID的用戶發送聊天消息。

讓我知道你是否需要此方法的任何澄清。

+0

不錯的做法,但正如我上面所看到的,我得出結論,爲特定用戶羣可以聊天的通知和私人聊天頻道創建每個用戶頻道。也就是說,我認爲這是一個更好的分離模型。 – user3746259

+0

*這與您的不同,因爲您只有每個用戶一個頻道並且沒有獨立的聊天頻道。安全檢查也可以在服務器端完成,在用戶嘗試訂閱一個頻道 – user3746259

+0

**的瞬間,您不能使用該方法直接通過使用js將消息從客戶端發送到客戶端 - 但我認爲這不是所以不好,因爲服務器端檢查必須在所有情況下始終完成 – user3746259