【问题标题】:Websockets Notification- / Chat- SystemWebsockets 通知-/聊天-系统
【发布时间】:2015-12-29 15:22:11
【问题描述】:

我已经阅读了很多关于 websocket 的内容,并且已经在我的系统中实现了它们。这个问题是关于如何正确使用它们。我想以正确的方式实现通知和聊天系统。

对于通知,我有频道“通知/频道”,对于聊天,我有频道“聊天/频道”。

这两个渠道是不是太“全球化”了?假设当网站有 1.000.000 个用户时,这意味着所有这些用户都将在这两个渠道中。当一个通知被发送给另一个特定用户时,这意味着该消息是通过一个频道发送的,该频道有 1.000.000 名用户订阅。

与聊天消息相同。假设一个用户想与另一个用户聊天。每条消息都会经过所有用户订阅的频道,最后,由于传递了receiver_id,只有目标用户会收到消息。

如何正确处理通知渠道和“私人”聊天渠道?

为每个用户创建一个“子频道”(群聊和通知,例如“notifications/channel/user1”)会更高效、更安全,还是让所有用户进入一个大频道?

【问题讨论】:

  • 没有想法?我认为这是每个人在谈到 websockets 时都应该考虑的事情,所以一定有推荐的方法来做到这一点。
  • 您真的希望所有 100 万用户在同一个群组中聊天吗?否则,您显然需要将事物划分为子组。与通知相同。除了性能影响之外,出于隐私原因,并非所有用户都应该收到所有通知。
  • 我不是指在一个大群组中聊天或发送通知 - 我的意思是在一个大频道中并将它们发送给特定用户。
  • 如果您想针对单个用户,为什么要设置一个大频道(大概将收件人作为负载的一部分)而不是为用户组或每个用户主题设置专用频道?
  • @user3746259,在这种情况下,您误用了行话“频道”。从上下文来看,您似乎正在考虑一个套接字,即用户连接到您的服务器的方式的逻辑表示。频道一词意味着广播域:有人向频道发送消息,订阅该频道的每个人都会收到它。 -- 那么,你的意思是通道还是连接套接字? (或者,你的意思完全是别的意思,需要帮助想出正确的术语吗?)

标签: php websocket notifications rpc publish-subscribe


【解决方案1】:

我个人的解决方法如下:

每个用户有 1 个 websocket 连接。此连接将用于传递所有数据。我会使用 json 格式来回传递数据。我会使用 json 结构中的一个字段来指示消息的类型,以及其他信息,例如聊天室 ID。所以,如果我想发送一个通知,它可能是这样的(非常简单的例子):

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

聊天消息是这样的:

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

客户端 Javascript 逻辑将确定消息的类型以及如何处理它。服务器端逻辑将确定用户是否“订阅”到指定的聊天室,因此它会知道将哪些聊天消息发送给哪个用户。这样可以保证其安全,因此您不会向未订阅房间 ID 的用户发送聊天消息。

如果您需要对此方法的任何说明,请告诉我。

【讨论】:

  • 不错的方法,但正如我在上面所读到的,我得出的结论是为每个用户创建通知频道和私人聊天频道,特定用户组可以在其中聊天。也就是说,我认为,一个更好的分离模型。
  • * 这与您的不同,因为每个用户只有一个频道,没有单独的聊天频道。安全检查也可以在用户尝试订阅一个频道的那一刻在服务器端完成
  • ** 并且您不能使用该方法仅通过使用 js 直接从客户端向客户端发送消息 - 但我认为这并不是那么糟糕,因为服务器端检查必须在所有情况下始终完成
  • 我想我对你想要做什么感到困惑。对不起
  • 以正确的方式使用 websockets 进行通知和聊天。
猜你喜欢
  • 2020-12-29
  • 2012-05-03
  • 2016-10-02
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多