0

ビジネスアプリの1つに1000人のログインユーザーがいるとしましょう。ユーザーの 1 人xyzがサーバーにリクエストを送信したが、サーバーがそのリクエストの応答を返すために 5 ~ 10 分かかる/完了する必要がある場合。

注:私のアプリは Google App Engine (Python) で実行されているため、締め切り超過エラーが発生します。

その場合、ここでタスク/バックグラウンド タスクキューを呼び出しています。ただし、クライアントは、要求されたタスクのステータスが完了したかどうかを知りません。

そのため、ステータスを取得するには、 likePubNubまたはを使用してプッシュ機能 (サードパーティ) を実装しようとしていますPusher

ここでの懸念は、要求されたクライアント xyzのみにメッセージを公開するにはどうすればよいですか?

xyz: サーバー パブリッシュ ステータス メッセージは、そのチャネルに存在するすべてのログイン ユーザーではなく、要求されたクライアントに対してのみ警告/通知する必要があります。

PubNubまたはのためにここにいる初心者ですPusher

この種のシナリオをカバーするためのアイデア/ロジックはありますか?

テクニカル ノート: Google App Engine Python、Javascript。

更新

(サンドボックス層など) のどのプランがpubnub必要ですか?

4

2 に答える 2

3

バックグラウンド処理の長時間実行タスクに TaskQueues を使用した、Google App Engine でのサーバー送信プッシュ通知

これは、Google App Engineタスク/バックグラウンド タスクキューを使用して、TaskQueue 処理ステップのステップを完了したとき、および TaskQueue が完全に完了したときにユーザーに通知するために、 Google App Engine Python ソリューションで必要なソース コードです。ちょっと待って!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' }
)

基本的に、ユーザーセッション 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)])

基本的な概念は、タスクをキューに開始/追加する TaskQueue URL コマンドとともにSESSION IDをポストすることです。その後、TaskQueue が開始されたら、URL パラメータを取得できます。

複数のステップがあるかどうか疑問に思っている場合、答えは「ステップは 1 つだけです」です。

于 2013-04-12T06:04:15.307 に答える
1

メッセージで特定のユーザーをターゲットにする最善の方法は、ユーザーに独自のチャンネルを購読させることです。次に、そのチャンネルを購読できる人を制限できます。

Pusher では、複数のユーザーが同じチャンネルを購読することはできませんが、それらのユーザーの 1 人だけにメッセージ/イベントを送信できます。私の知る限り、PubNub もこの機能を提供していません。

どちらのサービスも、サブスクライブできるチャネルの数を制限していないため、一般に、ユーザーごとにチャネルを持つことが適切なソリューションです。

于 2013-04-06T12:44:45.907 に答える