【问题标题】:Can I attach and subscribe to channels using wildcards?我可以使用通配符附加和订阅频道吗?
【发布时间】:2018-09-26 04:22:00
【问题描述】:
当使用Ably 通过 WebSockets 发布/订阅时,我可以像这样使用通配符订阅多个频道
var channel = ably.channels.get('foo:*')
channel.attach()
(免责声明:我是 Ably 的开发者倡导者,并在 Stack Overflow 上发布并自行回复 commonly asked support question,以便我们的用户可以更轻松地找到它)
【问题讨论】:
标签:
websocket
real-time
publish-subscribe
ably-realtime
【解决方案1】:
附加到频道时,您需要明确提供要附加到的频道名称,例如:
var channel = ably.channels.get('announcements')
channel.attach()
不可能在单个操作中附加到多个通道,即不支持以下内容:
var channel = ably.channels.get('foo:*')
channel.attach()
/* attempting to attach to all channels matching the name foo:* will not work */
由于多种原因,这是不可能的:
在单个操作中附加到无限数量的通道将无法扩展您的客户端设备或终止这些连接的服务器
Ably 集群中的通道动态分布在可用资源中并且经常移动。每个通道在很大程度上是自主的,这对于确保系统保持可靠而没有单点故障或拥塞非常重要。如果客户端要订阅与通配符匹配的所有通道,则需要维护与集群中可能正在运行通道的每个服务器的连接,以防创建与该通配符匹配的通道。这无法扩展。
-
如果您订阅了通配符频道,则不可能提供 Ably 在频道上提供的数据传输保证和服务质量,因为:
- 在任何时候都无法确定地知道客户端实际连接到哪些通道
- 如果客户端设备过载(无法跟上流)或超出速率限制,Ably 的服务器将不得不有选择地开始通过随机通道丢弃消息,以确保客户端可以继续接收消息。应该丢弃哪些消息?客户如何确定他/她错过了哪些消息?
但是,由于 Ably 的连接是多路复用的,因此允许您通过同一连接动态地附加和分离任何频道,当然可以通过根据需要附加到频道来有效地订阅通配符频道。