【问题标题】:Server Push Notification to Requested Client xyz: WebSocket Pusher/Pubnub服务器向请求的客户端 xyz 推送通知:WebSocket Pusher/Pubnub
【发布时间】:2013-03-27 21:37:21
【问题描述】:

假设我在一个 biz 应用程序中有 1000 个登录用户。现在,如果用户 xyz 之一将请求发送到服务器,但服务器需要/花费 5-10 分钟来完成/返回该请求响应。

注意:由于我的应用程序在 Google App Engine (Python) 上运行,这会引发截止日期超出错误。

在这种情况下,我在这里调用任务/后台任务队列。但客户端不知道请求的任务状态是否已完成。

为了获得状态,我正在尝试使用 PubNubPusher 实现推送功能(第 3 方)。

现在这里的问题是,我怎样才能只向请求的客户端xyz 发布消息?

注意:服务器发布状态消息应仅向请求的客户端xyz发出警报/通知,而不是向该频道中存在的所有登录用户。

作为PubNubPusher 的新手。

那么有什么想法/逻辑可以涵盖这种情况吗?

技术说明: Google App Engine Python、Javascript。

更新

我们需要pubnub(沙盒层等)的哪个计划?

【问题讨论】:

  • 我们正在尽快回复您的 Nicks。
  • @PubNub:感谢团队 :) 等待您为我提供适当的答案/解决方案..!!
  • 很好的查询。!!! @PubNub:等待回复..!!!

标签: python websocket real-time pusher pubnub


【解决方案1】:

通过消息定位特定用户的最佳方式是让用户订阅他们自己的独特频道。然后,您可以限制谁可以订阅该频道:

Pusher 不允许您让多个用户订阅同一个频道,而是只向其中一个用户发送消息/事件。据我所知,PubNub 也不提供此功能。

这两项服务都不限制您可以订阅的频道数量,因此每个用户拥有一个频道通常是一个不错的解决方案:

【讨论】:

    【解决方案2】:

    Google App Engine 上的服务器发送推送通知,使用 TaskQueue 进行后台处理长时间运行的任务

    这是您在 Google App Engine Python 解决方案中需要的源代码,用于在使用 Google App Engine 任务/背景时通知用户taskqueue 已完成 TaskQueue 处理步骤中的一个步骤,并且当 TaskQueue 已完全完成时。可是等等!您只想将通知发送给发起 TaskQueue 请求的特定用户

    第 1 步 - 如何仅向客户端 XYZ 发布消息?

    这很简单,这里是源代码:

    此外,为了保护您的应用,请确保您通过以下方式获得正确的密钥:https://admin.pubnub.comdashboard。

    JavaScript

    <script src=https://pubnub.a.ssl.fastly.net/pubnub-3.4.3.min.js></script>
    <script>(function(){
    
        var pubnub = PUBNUB.init({ subscribe_key : 'demo', ssl : true });
        pubnub.subscribe({
            channel : '0IHM4b2VpamZhaWU0eThyaWpvaWdma3Mg',  // SESSION ID
            message : function(message) { alert(message) }  // ALERT MESSAGE
        });
    
    })();</script>
    

    请注意,我们使用一个简单的 JavaScript Alert() 函数来显示消息,但是您可能希望将其转换为页面上更强大的 &lt;div&gt;{message-here}&lt;/div&gt; 通知区域。

    任务队列设置

    taskqueue.add(
        url='/my-long-task',                                                                              
        countdown=1,
        method='GET',
        params={ 'sessionid' : '0IHM4b2VpamZhaWU0eThyaWpvaWdma3Mg' }
    )
    

    基本上,您使用用户会话 ID 将通信路由到用户 XYZ。现在在 Google App Engine Python 中,您将使用 Session ID 向客户端发布您想要的任何消息状态。

    Google App Engine - Python 任务

    import webapp2
    from Pubnub import Pubnub ## Download - https://raw.github.com/pubnub/pubnub-api/master/google-app-engine/python/Pubnub.py
    pubnub = Pubnub( "demo", "demo" )
    
    def server_to_client_notify( sessionId, message ):
            pubnub.publish({
                "channel" : sessionId, ## SESSION ID
                "message" : "hi!"
            })
    
    class LongRunningTaskQueue(webapp2.RequestHandler):
        def get(self):
            ## GET Session ID
            sessionId = urllib.unquote(self.request.get( 'sessionid', '' ))
    
            server_to_client_notify( sessionId, "Starting Your Job" )
            ## - DO A LOT OF WORK - ##
            ## - DO A LOT OF WORK - ##
            ## - DO A LOT OF WORK - ##
    
            server_to_client_notify( sessionId, "Your Job is Nearly Complete" )
            ## - DO A LOT OF WORK - ##
            ## - DO A LOT OF WORK - ##
            ## - DO A LOT OF WORK - ##
    
            server_to_client_notify( sessionId, "Your Job has Finished!" )
    
    app = webapp2.WSGIApplication([('/my-long-task', LongRunningTaskQueue)])
    

    基本概念是您发布 SESSION ID 以及启动/添加任务到队列的任务队列 URL 命令。然后当 TaskQueue 启动时,您可以获取 URL 参数。

    如果您想知道是否会有超过 1 个步骤,答案是:“只有一个步骤。”

    【讨论】:

    • 非常感谢 Pubnub 团队 :) 我还有一个查询,即使应用程序一次有 1000 个登录用户,我们可以使用相同的逻辑吗? (如果我们'hv Free Sandbox Tier pubnub 计划 :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2020-07-15
    • 2015-06-15
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多