【问题标题】:Modifying Pubnub presence heartbeat for Python修改 Python 的 Pubnub 存在心跳
【发布时间】:2015-09-01 18:36:57
【问题描述】:

根据存在文档,Pubnub 将在未收到心跳 5 分钟后触发超时存在事件。 我需要修改此值,但我找不到使用 Python SDK 执行此操作的方法。以下是 Pubnub 文档的链接,展示了如何使用 JavaScript:http://www.pubnub.com/docs/web-javascript/presence#optimizing_timeout_events

有人知道如何使用 python SDK 实现这一点吗?

非常感谢。

编辑:我的客户不是 javascript 客户。它们是 python 控制台应用程序。

【问题讨论】:

  • 您是在尝试监控存在还是从服务器端订阅?如果没有,那么您只需从 JavaScript 客户端设置 heartbeat 设置即可。无需从服务器端执行此操作,因为监视此间隔的不是您的服务器,而是控制此间隔的 PubNub 网络。如果您使用 Python 从服务器端订阅或监控存在,请告诉我,因为有这样做的最佳实践,而直接监控不是方式。
  • 我的客户不是 javascript 客户。它们是 python 控制台应用程序。
  • 啊,明白了。感谢您提供的详细信息。哪个版本的 PubNub Python SDK?
  • 我目前使用的版本是PubNub 3.7.3

标签: javascript python publish-subscribe pubnub


【解决方案1】:

心跳可以通过猴子修补到 Pubnub 类中,如下所示:

from pubnub import Pubnub

class PubnubHeartbeat(Pubnub):
    def __init__(self, heartbeat=300, **kwargs):
        self.heartbeat = heartbeat
        super(PubnubHeartbeat, self).__init__(**kwargs)

    def getUrl(self, request):
        if "subscribe" in request['urlcomponents'][:2]:
            if "urlparams" not in request:
                request['urlparams'] = {}
            request['urlparams']['heartbeat'] = self.heartbeat

        return super(PubnubHeartbeat, self).getUrl(request)


p = PubnubHeartbeat(
    subscribe_key="demo",
    publish_key="demo",
    heartbeat=60
)

def recv(msg):
    print msg

p.subscribe(channels="heartbeat_test", callback=recv)

不建议将这用于长期生产代码(除非您在安装期间使用 pubnub==3.7.3 固定您的 Pubnub 依赖项)。示例子类使用未记录的方法来注入 heartbeat URL 参数。 (有关其作用的描述,请参见 Craig Conover 的回答)。

【讨论】:

  • 杰伊的贡​​献很大!干杯。
  • 太好了,我假设设置 heartbeat_interval 将遵循相同的过程?
  • heartbeat_interval 是要添加的额外过程。天真的方法是一个定期计时器,它向url = 'http://pubsub.pubnub.com/v2/presence/sub-key/%s/channel/%s/heartbeat?uuid=%s' % (p.subscribe_key, ','.join(p.subscriptions), p.uuid) 发出请求。频率应约为heartbeat 参数的一半。如果您使用heartbeat=60,则每 30 秒发出一次附加请求。 (应注意避免低心跳;heartbeat=10 每 5 秒额外请求一次是不合理的。)
  • 非常感谢杰森,真的很有帮助。
【解决方案2】:

PubNub Python SDK 存在

由于 Python 很少用作 客户端PubNub Python SDKpresence API 没有像 传统 客户端 SDK(JavaScript 等)那样健壮地实现。 )。因此,Pubnbub 初始化程序中没有心跳参数,也没有 setterattribute,因此您不得不坚持使用默认的 5 分钟心跳设置。

但是,对于 PubNub JavaScript SDK,当您使用自定义 heartbeat(例如 60 秒)初始化 PUBNUB 时,heartbeat 键/值只是作为 REST URL 中的查询参数传递:

http://pubsub.pubnub.com/subscribe/demo/my_channel/0/14411482999795083?uuid=12345&pnsdk=PubNub-JS-Web%2F3.7.14&heartbeat=60

因此,如果您真的愿意,您可以使用 REST 调用订阅并以这种方式传递 heartbeat

我第一次发布此答案时忘记提及的是,您的客户端负责至少每 60 秒 ping PubNub 服务器一次,最好以 30 秒为间隔,这是服务器配置的 60 秒心跳窗口这个客户。

使用 PubNub SDK,这是通过同一连接在单独的线程中完成的(某种程度上 - 至少以服务器知道设置心跳的同一客户端的方式)。

也就是说,我们正在使用 REST 获得一个不那么简单的解决方案,所以为什么还要使用 SDK。对我们来说更新 Python SDK 比你做所有的脏活要容易。我们会这样做,但不是在短期内,但希望在 Python SDK 的下一个次要版本中。

根据我们的非 SO 对话,您只想缩短客户端看起来在线的时间窗口,而实际上客户端未连接并且在连接关闭之前无法显式取消订阅(关闭终端,而不是使用应用程序的 UI 或命令行“注销”)。

你可以做的是实现一个 ping/ack 握手协议。这是非常高的级别,因此可能需要填写一些更精细的点,但它应该提供一般概念。

  • 在一个客户端(发送方)与另一个(接收方)进行通信之前,只需在客户端的 private 通道上向另一个客户端发送 ping 消息(每个客户端都会订阅该客户端独有的频道:例如,private_client001、private_client002 等)。
  • 接收客户端将自动回复发送者的唯一通道(这将是 ping 消息负载的一部分)
  • 如果 ping 的发送方在一秒钟内(或任何适合您的时间容限)内没有收到确认消息,则假定接收方不在线。
  • 当接收方重新上线时,您会收到错过的消息,以及任何不到 5 分钟的 ping,您可以回复并查看发送方是否仍想参与。

这是许多用例(尤其是聊天)的常见问题,因为总有一个时间窗口(心跳窗口),客户端可能确实处于离线状态,但似乎在线,因为他们没有在适当的、可预测的时间内离开会产生显式unsubscribe 的时尚,从而导致leave 事件。所以实现这种握手预连接协议是一个很好的实践。

【讨论】:

  • Jason Oster 的答案似乎有效,但现在我的客户超时不成熟。我最好的猜测是 heartbeat_interval 设置不正确。有关如何处理该问题的任何线索?
  • PubNub 工程将优先实现 Python SDK 的完整 Presence 功能。感谢您对此的反馈。
  • 具有完整 Presence 功能的新 SDK 将于 9 月底推出。
  • PubNub Python SDK 现在具有完整的 Presence 功能:呈现事件和状态元数据。
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
相关资源
最近更新 更多