2016-04-01 11 views
0

local emulated pubsub serverに対してGo pubsub libraryを使用しようとしています。 「旧式」(廃止予定)機能(例:CreateSubおよびPullWait)が見つかりましたが、「新しいスタイル」のAPI(たとえばIteratorsおよびSubscriptionHandles)が期待どおりに機能しません。"new style" google pubsub golang関数が正しく機能しない

「new style」APIを使用するアクションと「old style」APIを使用するアクションの両方をテストする2つの異なる単体テストを作成しました。

シーケンスは次のとおりです。

  • がメッセージ
  • を公開
  • は(利用可能なし以来の)任意のメッセージを引っ張って失敗するサブスクリプションを作成し、そのメッセージを引くが、それに
  • をACKはありません
  • 最後に再度プルします。これは、メッセージACKタイムアウトが最初に期限切れになるため、10秒かかるはずです。

https://gist.github.com/ianrose14/db6ecd9ccb6c84c8b36bf49d93b11bfb

古いスタイルのAPIを使用したテストでは、私が期待するのと同じように動作します:新しいスタイルのAPIを使用してテストは信頼できない作品

=== RUN TestPubSubRereadLegacyForDemo 
--- PASS: TestPubSubRereadLegacyForDemo (10.32s) 
    pubsubintg_test.go:217: PullWait returned in 21.64236ms (expected 0) 
    pubsubintg_test.go:228: PullWait returned in 10.048119558s (expected 10s) 
PASS 

のに対し。

=== RUN TestPubSubRereadForDemo 
--- PASS: TestPubSubRereadForDemo (11.38s) 
    pubsubintg_test.go:149: iter.Next() returned in 17.686701ms (expected 0) 
    pubsubintg_test.go:171: iter.Next() returned in 10.059492646s (expected 10s) 
PASS 

しかし、時には、私はそれが必要(とあまりにも道もはやそれは必要以上にどのように二iter.Nextに注意)としてiter.Stop()が速やかに返さないことが判明:予想通り時には物事が動作し

=== RUN TestPubSubRereadForDemo 
--- FAIL: TestPubSubRereadForDemo (23.87s) 
    pubsubintg_test.go:149: iter.Next() returned in 7.3284ms (expected 0) 
    pubsubintg_test.go:171: iter.Next() returned in 20.074994835s (expected 10s) 
    pubsubintg_test.go:183: iter.Stop() took too long (2.475055901s) 
FAIL 

そして、私は(それはインスタントの近くでなければなりません)メッセージを公開後最初のプルは時間がかかりすぎることがわかり、他の回:

=== RUN TestPubSubRereadForDemo 
--- FAIL: TestPubSubRereadForDemo (6.32s) 
    pubsubintg_test.go:147: failed to pull message from iterator: context deadline exceeded 
FAIL 

任意のアイデア?新しいスタイルのAPIを使用した実際の使用例はありますか?残念ながら、Go starter project hereは廃止予定の古いAPIを使用しています。

答えて

0

(注:それはあなたがリンクしたコードと一致していない、あなたの出力例では、行番号のように見える)

しかし、時には、私はiter.Stop()が返していないことが判明すぐにそれを行うべきである

iter.Stopを呼び出すときに過度の遅延を修正するいくつかの変更が最近着陸しました。すべてのメッセージが拒否された場合、即座に戻ります。同期してもう一度テストしてみてください。

(とあまりにも道もはやそれは必要以上にどのように二iter.Nextに注意してください):新しいAPIを使用して、あなたのコードでは

、あなたが最初の空のサブスクリプションからプルを行い、使用して1s期限の文脈。これを「プルリクエストA」としましょう。基礎となるhttp要求は取り消されますが、サーバーが尊重する方法で接続が閉じられていないようです。したがって、サーバーに関する限り、「A」はまだ保留中です。パブリッシュの直後に、新しいプルリクエストを行い、それを「B」と呼ぶことにしましょう。プル要求Bによってメッセージが返された後、メッセージはパックされていないままになり、別のプル要求「C」を行います。

ここで、メッセージを公開すると、サーバーはメッセージを「A」または「B」のいずれかに配信します。最初に "A"に渡すと、最初のプルが5秒のコンテクストの期限を過ぎていることがわかります。最初に "B"にパブリッシュされている場合は、最初のプルが期待通りに素早く戻ってきます。メッセージが「B」にパブリッシュされ、未処理のままにされた後、サーバーはそれを「A」または「C」に再配信します。最初に「A」を選んだ場合、2回目のプルが予想よりも長くかかることになります。それが "C"を選んだ場合、最初と2番目の引っ張りが期待どおりに長く続くのが見えます。

空のサブスクリプションから最初のプルを実行しない場合、期待通りにテストが動作するはずです。

注:古いAPIを使用している場合は、古いAPIを使用して余分な「プルから空のサブスクリプション」リクエストを行っていないため、これは表示されません(おそらく、コンテキスト)。

脇に:メッセージを残さない場合は、Message.Done(false)を呼び出す必要があります。

+0

過去数日間のコミットを引っ張った後、私は 'iter.Stop()'が期待どおりに動作しているのを見る - ありがとう。途中で終わらない最初のプルリクエスト( "A")に関するあなたのコメントに関して、それはpubsubバグですか?それとも私は回避できる何か?そういうわけで、これは私にとって地雷になるでしょう。 –

+0

これは特にGoライブラリのプロパティではありません。メッセージを発行する前に他のメカニズムを使用してプルリクエストを作成(取り消し)すると、同じ動作が表示されます。 –

関連する問題