0

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

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

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

因此,要获得状态,我正在尝试使用 likePubNub或实现推送功能(第 3 方) Pusher

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

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

作为新手在这里为PubNubor Pusher

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

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

更新

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

4

2 回答 2

3

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

这是您在Google App Engine Python 解决方案中需要的源代码,用于在使用Google App Engine任务/后台任务队列已完成任务队列处理步骤中的一个步骤以及任务队列已完全完成时通知用户。可是等等!您只想将通知发送给发起 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.add(
    url='/my-long-task',                                                                              
    countdown=1,
    method='GET',
    params={ 'sessionid' : '0IHM4b2VpamZhaWU0eThyaWpvaWdma3Mg' }
)

基本上,您使用 User Session 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 个步骤,答案是:“只有一个步骤”。

于 2013-04-12T06:04:15.307 回答
1

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

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

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

  • Pusher在所有计划中提供无限频道。
  • PubNub 还提供无限频道(请参阅:https ://help.pubnub.com/entries/21096201-How-Many-Channels-Can-I-Use- )。多路复用时每个客户端似乎有100 个通道的限制,根据您的应用程序,您可能必须考虑到这一点,但通常每个客户端 100 个通道应该绰绰有余。
于 2013-04-06T12:44:45.907 回答