2016-08-29 12 views
1

私は1つのサブスクリプションでpubsubトピックを持ち、2人の異なるサブスクライバがそれから引き出しています。 stackdriverを使って、サブスクリプションに〜1000のメッセージがあることがわかります。 各加入者は、次のポーリング・ループを実行します:クラウドpubsub低速ポーリングレート

client = pubsub.Client() 
topic = client.topic(topic_name) 
subscription = pubsub.Subscription(subscription_name) 

while True: 
    messages = subscription.pull(return_immediately=True, max_messages=100, client=client) 
    print len(messages) 
    # put messages in local queue for later processing. Those processes will ack the subsription 

私の問題は、遅い投票率である - 私は、私は毎回のみいくつかのメッセージを取得していますポーリングされるのを待っているメッセージをたくさん持っているにもかかわらず。また、メッセージがなくてもたくさんの返信が返ってきます。 stackdriverによると、私のメッセージの引き出し速度は〜1.5メッセージ/秒です。

私はreturn_immediately=Falseを使用することを試みたが、それはそれを少し改善 - ない私が持っていることを期待する率 - プル率は〜2.5メッセージ/秒、それでもに増加しました。

任意のアイデアをどのように引き上げ速度を上げるには?どのpubsub投票ベストプラクティス?

答えて

1

プルレートを向上させるには、一度に複数のプルプル要求を行う必要があります。どのくらいの速さで、どのくらいの場所からあなたが公開するかによって異なります。あなたは常に少なくともいくつかの未解決のものが必要になります。そのうちの1人が戻ったらすぐに、別のプルリクエストを作成します。こうすることで、Cloud Pub/Subがメッセージを購読者に配信する準備が整うと、メッセージの受信を待っているという要求があります。

+0

これはまさに私がやっていることです。 pubsubメッセージを受け取ったら、私はローカルのredis/rabitmqにそれを公開します。他のプロセスはそこからそれを取ります。私はいくつかのマシンを持っています(現在は2つです.1000メッセージの負荷を処理する必要があるためです)。それぞれがサブスクリプションからメッセージを取り出して配信し、新しいプル・リクエストを作成します – sagie

+0

さらにサブスクリプションには〜1000メッセージがあります。 'max_messages = 200'のプル操作でいくつかのメッセージしか返されないのはなぜですか?' return_immediate = False'ではメッセージが返されないことがあります。 – sagie

+0

複数のプルリクエストを同時に未処理にする必要があります。 2台のマシンがあれば、必ずしもそれが保証されるわけではない。彼らは同時に同じ時間に戻ることができ、今あなたは未解決の要求がない状態にいます。あなたが1000のメッセージを言うとき、これは合計か、それとも1秒あたりのメッセージの数ですか? –