我可以使用通配符附加和订阅频道吗?

Can I attach and subscribe to channels using wildcards?

当通过 WebSockets 为 Pub/Sub 使用 Ably 时,我可以像这样使用通配符订阅多个频道吗

var channel = ably.channels.get('foo:*') 
channel.attach()

(免责声明:我是 Ably 的开发者倡导者,并在 Stack Overflow 上发布和自我回答 commonly asked support question 以便我们的用户可以更轻松地找到它)

附加到频道时,您需要明确提供要附加的频道名称,例如:

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 在频道上提供的数据传输保证和服务质量,因为:

    1. 在任何时间点都没有办法确定地知道客户端实际连接到哪些频道
    2. 如果客户端设备过载(跟不上流)或超过速率限制,Ably 的服务器将不得不选择性地开始通过随机通道丢弃消息,以确保客户端可以继续接收消息。应该丢弃哪些消息?客户如何计算出 he/she 错过了哪些消息?

但是,由于 Ably 的连接是多路复用的,因此允许您通过同一连接动态地附加和断开任何频道,当然可以通过在需要时附加频道来有效订阅通配符频道。