Pub/Sub の使用中に問題が発生した場合に役立つトラブルシューティング手順について説明します。
サブスクリプションを作成できない
以下を行ったことを確認します。
name
フィールドにサブスクリプション名を指定している。バージョン v1beta2 以降では、サブスクリプション名をprojects/project-identifier/subscriptions/subscription-name
という形式で指定する必要があります。topic
フィールドに、サブスクライブ先とする既存のトピックの名前を指定している。バージョン v1beta2 以降では、トピック名をprojects/project-identifier/topics/topic-name
という形式で指定する必要があります。- 受信 URL のプロトコルとして、
pushEndpoint
フィールドにhttps://
を小文字で指定している(http://
やHTTPS://
は不可)。
403 (Forbidden)
エラー
このエラーが発生した場合、以下を行ってください。
- Google Cloud コンソールで Pub/Sub API が有効になっていることを確認します。
- プロジェクト間の通信に Pub/Sub API を使用する場合は、リクエストを行うプリンシパルが、関連する Pub/Sub API リソースに必要な権限を持っていることを確認します。
- Dataflow を使用している場合は、
<projectId>@cloudservices.gserviceaccount.com
と Compute Engine サービス アカウントの<projectId>-compute@developer.gserviceaccount.com
の両方が、関連する Pub/Sub API リソースに対して必要な権限を持っていることを確認します。詳細については、Dataflow のセキュリティと権限をご覧ください。 - App Engine を使用している場合、プロジェクトの権限ページで、App Engine サービス アカウントが編集者としてリストされているかどうか確認します。リストされていない場合、App Engine サービス アカウントを編集者として追加します。通常、App Engine サービス アカウントは
<project-id>@appspot.gserviceaccount.com
という形式になります。
重複の処理と再試行の強制
確認応答期限が切れる前にメッセージの確認応答を行わないと、Pub/Sub によってメッセージが再送信されます。その結果、Pub/Sub によって重複するメッセージが送信されることがあります。Cloud Monitoring で expired
レスポンス コードを使用して確認応答オペレーションをモニタリングし、この状態を検出します。このデータを取得するには、subscription/expired_ack_deadlines_count
指標を選択します。
メッセージの期限を延長すると、重複率を低下させることができます。
- 期限の延長はクライアント ライブラリによって自動的に処理されますが、構成可能な延長期限の最大値にはデフォルトの上限があります。
- 独自のクライアント ライブラリを構築する場合は、
modifyAckDeadline
メソッドを使用して、確認応答期限を延長します。
あるいは、Pub/Sub にメッセージの再試行を強制するには、modifyAckDeadline
を 0 に設定します。
過剰な管理オペレーションの使用
管理オペレーションで割り当てを過剰に消費している場合、コードのリファクタリングが必要な可能性があります。ここでは、以下の疑似コードに基づいて説明します。この例では、リソースの消費を試行する前に、管理オペレーション(GET
)を使用して、サブスクリプションが存在することを確認しています。GET
と CREATE
の両方が管理オペレーションです。
if !GetSubscription my-sub { CreateSubscription my-sub } Consume from subscription my-sub
サブスクリプションからメッセージを利用すると、より効率的になります(ただし、サブスクリプションの名前がある程度確実にわかる場合に限ります)。この楽観的なアプローチでは、エラーが発生した場合にのみサブスクリプションが取得または作成されます。次の例を考えてみましょう。
try { Consume from subscription my-sub } catch NotFoundError { CreateSubscription my-sub Consume from subscription my-sub }