动态加入和离开 pubnub 频道的最佳方式是什么
What's the best way to join and leave pubnub channels dynamically
我正在处理这种聊天类型的场景,需要跟踪状态 -
注意:此场景中的每个客户端都将订阅选项 withPresence 设置为 true。
Pubnub 配置-
Max announce 设置为 1,所以我依赖间隔事件类型。
phoneA 将向服务器询问频道名称,服务器将生成一个唯一的频道名称(比如说 ch-chat)并 return 到 PhoneA。
现在phoneA和server都会将频道添加到自己的频道组(cg-phoneA和cg-server)并订阅自己的频道组。
PhoneA 与 phoneB 和 phoneC 共享频道名称,并且他们都将频道添加到自己的频道组 cg-phoneB 和 cg-phoneC。 Bkth B和C也订阅了自己的频道组。
现在,
当 phoneA 从自己的频道组(cg-phoneA)中删除频道(ch-chat)时,服务器不会在 interval 事件的 leave uuids 列表中获取 phobeA。但是在 ~5 分钟后服务器获取 phoneA 的超时事件。
我想要的 -
phoneA 应该出现在间隔事件的离开列表中,因为 phoneA 从其自己的频道组中删除了频道,因此无法再订阅它。
存在模式:通告与间隔
一个问题是您的 Announce Max 设置为 1 将使除 state-change
之外的所有在线事件静音。换句话说,您在每个频道的所有时间都处于 Interval 模式。详细了解 Presence Event Modes here。
当频道被添加到频道组时,您应该会收到加入事件(如果处于 Announce 模式而不是 Interval),如果您订阅了频道组 withPresence: true
。不过,请确保您希望接收该频道组中所有频道的在线状态事件。您可以为不需要接收状态事件的频道创建第二个频道组。
管理渠道组
至于管理频道组中的频道,请确保只有您的服务器是所有频道组的一个 adding/removing 频道。这与启用 Access Manager 时的安全性有关(每个人都应该 enabled/implementing Access Manager 以保护您的密钥和用户)。
在线状态 Webhooks
至于在线状态 Webhooks,这是您的服务器监控在线状态事件的最佳方式。不建议您从您的服务器订阅。它将 difficult/complex 扩展到多个服务器实例。这就是 Presence Webhooks 存在的原因。您的客户端和 POST 直接向服务器发送它需要的任何请求,例如您的“生成新频道”请求。以及您的服务器并回复这些帖子,然后 publish
对客户订阅的频道的所有进一步更新。
频道命名约定
很高兴您使用“生成的频道名称”(如 UUID 模式),但在您的频道前面加上前缀以识别它们,从而提供一种通过正则表达式通过模式匹配对它们进行分组的方法。我建议使用“点”,这样您还可以利用 PubNub 通配符功能:
- PubNub 函数频道绑定
- 状态 ACL(自定义状态通道行为配置)
- Access Manager 通配符授予
- 通配符订阅
例如:
chat.4849-ut83-83jd...
notify.tuy7-87er-27fn...
注意:频道组名称中不允许使用“点”,并且没有任何通配符功能。
我正在处理这种聊天类型的场景,需要跟踪状态 -
注意:此场景中的每个客户端都将订阅选项 withPresence 设置为 true。
Pubnub 配置- Max announce 设置为 1,所以我依赖间隔事件类型。
phoneA 将向服务器询问频道名称,服务器将生成一个唯一的频道名称(比如说 ch-chat)并 return 到 PhoneA。
现在phoneA和server都会将频道添加到自己的频道组(cg-phoneA和cg-server)并订阅自己的频道组。
PhoneA 与 phoneB 和 phoneC 共享频道名称,并且他们都将频道添加到自己的频道组 cg-phoneB 和 cg-phoneC。 Bkth B和C也订阅了自己的频道组。
现在, 当 phoneA 从自己的频道组(cg-phoneA)中删除频道(ch-chat)时,服务器不会在 interval 事件的 leave uuids 列表中获取 phobeA。但是在 ~5 分钟后服务器获取 phoneA 的超时事件。
我想要的 - phoneA 应该出现在间隔事件的离开列表中,因为 phoneA 从其自己的频道组中删除了频道,因此无法再订阅它。
存在模式:通告与间隔
一个问题是您的 Announce Max 设置为 1 将使除 state-change
之外的所有在线事件静音。换句话说,您在每个频道的所有时间都处于 Interval 模式。详细了解 Presence Event Modes here。
当频道被添加到频道组时,您应该会收到加入事件(如果处于 Announce 模式而不是 Interval),如果您订阅了频道组 withPresence: true
。不过,请确保您希望接收该频道组中所有频道的在线状态事件。您可以为不需要接收状态事件的频道创建第二个频道组。
管理渠道组
至于管理频道组中的频道,请确保只有您的服务器是所有频道组的一个 adding/removing 频道。这与启用 Access Manager 时的安全性有关(每个人都应该 enabled/implementing Access Manager 以保护您的密钥和用户)。
在线状态 Webhooks
至于在线状态 Webhooks,这是您的服务器监控在线状态事件的最佳方式。不建议您从您的服务器订阅。它将 difficult/complex 扩展到多个服务器实例。这就是 Presence Webhooks 存在的原因。您的客户端和 POST 直接向服务器发送它需要的任何请求,例如您的“生成新频道”请求。以及您的服务器并回复这些帖子,然后 publish
对客户订阅的频道的所有进一步更新。
频道命名约定
很高兴您使用“生成的频道名称”(如 UUID 模式),但在您的频道前面加上前缀以识别它们,从而提供一种通过正则表达式通过模式匹配对它们进行分组的方法。我建议使用“点”,这样您还可以利用 PubNub 通配符功能:
- PubNub 函数频道绑定
- 状态 ACL(自定义状态通道行为配置)
- Access Manager 通配符授予
- 通配符订阅
例如:
chat.4849-ut83-83jd...
notify.tuy7-87er-27fn...
注意:频道组名称中不允许使用“点”,并且没有任何通配符功能。