Websockets:所有用户一个通道还是每个用户一个通道?

Posted

技术标签:

【中文标题】Websockets:所有用户一个通道还是每个用户一个通道?【英文标题】:Websockets: one channel with all the users or one channel per user? 【发布时间】:2015-10-06 10:48:05 【问题描述】:

我想在网站中实现基于 websocket 的推送通知。我已经在 SO 和 google 上搜索了这里,但我的问题有点不同。 我的用例: 当 userB 回复 userA 发表的评论时,userA 将收到一条推送通知,其中包含指向文章/评论的链接(类似于 SO) 我的研究: 在网络上,人们似乎同意(在可扩展性方面)最好限制 websocket 通道的总量。这导致每个用户有 1 个频道(= 每个频道将只包含 1 个用户)。为什么?考虑一个群聊,其中 1 个用户可以参与 10 个或更多讨论 --> 这意味着每个用户有 10 个或更多频道。 因此,每个用户 1 个频道是最好的解决方案(直到现在)。

我打算使用这个捆绑包https://github.com/GeniusesOfSymfony/WebSocketBundle 在文档中,有一个关于如何向特定用户https://github.com/GeniusesOfSymfony/WebSocketBundle/blob/master/Resources/docs/SessionSetup.md 发送消息的页面。此方法允许您仅向订阅同一频道的所有用户之间的 1 个用户发送消息。您可以通过将用户的用户名传递给函数来完成此操作。

这开启了一个新的可能性:只创建一个所有登录用户都订阅的大频道,而不是创建 N 个频道,其中 N 是经过身份验证的用户数。 换句话说,哪个更好:1 个频道有 1000 个订阅者或 1000 个频道有 1 个订阅者?

【问题讨论】:

【参考方案1】:

我建议您使用发布/订阅框架并依靠该框架的实现来扩展。您似乎正在解决一个以前已经解决过很多次的问题。搜索 ActiveMQ 发布/订阅、Kaazing JMS、Kaazing AMQP、Pusher、IBM MQTT/WS 等。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review 只是好奇的罗纳克。为什么不回答问题?它解决了海报的问题,对吗?伊戈尔正在走一条需要耗费大量精力和不必要时间的道路。使用 pub/sub 框架将解决他的问题并允许他处理应用程序而不是管道。

以上是关于Websockets:所有用户一个通道还是每个用户一个通道?的主要内容,如果未能解决你的问题,请参考以下文章

Websockets 控制用户访问

使用 websockets 时,我应该为每个不同的任务打开一个新的 websocket 连接吗?还是我应该在一个连接中完成所有事情?

Nuxtjs + Laravel Echo + Laravel Passport + Laravel WebSockets 无法从私人/状态通道获取事件

Node Js、websockets 保存通道中的连接

集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?

在 Rails 线程中访问变量