服务器推送通知到请求客户端xyz:WebSocket Pusher / Pubnub

时间:2013-04-05 12:51:43

标签: python websocket real-time pusher pubnub

让我们考虑一下biz app中有1000个登录用户。现在,如果用户xyz之一将请求发送到服务器但服务器需要/需要5-10分钟来完成/返回该请求响应。

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

在这种情况下我在这里调用task / background taskqueue。但客户端并不知道所请求的任务状态是否已完成。

所以要使用类似PubNubPusher来尝试使用推送功能(第三方)的状态。

现在关注的是,我如何才能向所请求的客户xyz发布消息?

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

作为PubNubPusher的新手。

所以任何想法/逻辑都要涵盖这种情况。?

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

更新

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

2 个答案:

答案 0 :(得分:3)

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

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

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

这很简单,以下是源代码:

  

另外,为确保您的应用安全,请务必通过以下网址获取正确的密钥:https://admin.pubnub.com信息中心。

的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()函数来显示邮件,但您希望将其转换为页面上更健壮的<div>{message-here}</div>通知区域。

TaskQueue Setup

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

您基本上使用用户会话ID 将通信路由到用户 XYZ 。现在,在Google App Engine Python中,您将使用会话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 以及TaskQueue URL命令,该命令将任务启动/添加到队列中。然后当TaskQueue启动时,您可以获取URL参数。

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

答案 1 :(得分:1)

使用邮件定位特定用户的最佳方法是让用户订阅自己的唯一渠道。然后,您可以限制谁可以订阅该频道:

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

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