ストリーミングのトラブルシューティング
このトピックでは、Oracle Cloud Infrastructure Streamingに関連する様々な問題と、その解決方法について説明します。すべてのサービスによって返される一般的なAPIエラーの詳細は、APIエラーを参照してください。
アクセスおよび権限のトラブルシューティング
リクエストによって「通信中の処理例外」メッセージと-1エラーが返される
ストリーミング・クライアントを使用してリクエストを送信すると、次のエラー・メッセージが表示される場合があります:
Caused by: com.oracle.bmc.model.BmcException: (-1, null, false) Processing exception while communicating to:
https://streams.<region>.streaming.oci.oraclecloud.com (outbound opc-request-id: <opc_request_id>)
at com.oracle.bmc.http.internal.RestClient.convertToBmcException(RestClient.java:540)
at com.oracle.bmc.http.internal.RestClient.get(RestClient.java:96)
at com.oracle.pic.oss.api.StreamAdminClient.getStream(StreamAdminClient.java:292)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMeth
このエラーは、クライアントまたはクライアントの環境に関連しています。ストリーミング・サービスはこれを送信しません。つまり、リクエストはサービスに達していません。
ストリーミング・エンドポイントに到達できることを確認します。telnetを使用して、パブリック・エンドポイントへの接続をテストできます。現在、Streamingではポート443と9092が使用されています。ポート443は、ストリーミングAPIおよびOracle Cloud Infrastructure SDKsで使用されます。ポート9092はKafkaプロトコルで使用されます。telnetテストでは、ユース・ケースに適したポートを指定する必要があります。
例:
telnet streams.<region>.streaming.oci.oraclecloud.com 443
telnet streams.<region>.streaming.oci.oraclecloud.com 9092
ストリーミング・サービスへの正常な接続では、Connected to cell-1.streaming.region.oci.oraclecloud.com.
メッセージが返されます。
telnetがUnable to connect to remote host
メッセージを返す場合は、ファイアウォール・ポリシーやネットワーク・セキュリティ・グループ・ルールなどのブロックの問題がないかネットワークを調査します。
リクエストによってNotAuthorizedOrNotFoundメッセージと404エラーが返される
ストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
com.oracle.bmc.model.BmcException: (404, NotAuthorizedOrNotFound,false)
Unknown stream ocid1.stream.oc1.phx.exampleuniqueID.
(opc-request-id: <opc_request_id>)
404エラーは通常、必要なリソースが見つからないか、それにアクセスできないことを意味します。たとえば、stream-pushポリシーがない場合、またはストリームが削除されたかアクセスできない場合があります。すべての権限が正しく設定されていることを確認してください。
リクエストによって「見つかりません」メッセージと404エラーが返される
ストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
Response { type: "cors", url: "https://streams.<region>.streaming.oci.oraclecloud.com/20180418/streams?
compartmentId=ocid1.tenancy.oc1..exampleuniqueID&limit=10&page=&sortBy=TIMECREATED&sortOrder=desc&lifecycleState=",
redirected: false, status: 404, ok: false, statusText: "Not Found", headers: Headers, bodyUsed: false }
console.js:35
このエラーは、権限関連の問題を示します。すべての権限が正しく設定されていることを確認してください。
リクエストによって「次のタグ・ネームスペース/キーが許可されていないか、見つかりません」メッセージが返される
このエラーは、ユーザーが使用する権限のないストリームにタグが存在することを示します。タグを削除するか、ユーザーに権限を付与してください。詳細は、リソース・タグを参照してください。
リクエストによって「不正なハンドシェイク」メッセージと104エラーが返される
ストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
SSLError(SSLError(\"bad handshake: SysCallError(104, 'ECONNRESET'.))
このエラーは通常、証明書に署名したCAがシステムに存在しないことを意味します。ホストにca-certificatesパッケージをインストールするか、ターゲット・エンドポイントからCA証明書をプルし、update-ca-trust
コマンドを使用してシステムのトラスト・ストアにそれをインポートする必要がある場合があります。
制限およびスロットルのトラブルシューティング
ストリーミング・リソースの制限では、次のシナリオが発生する可能性のあるサービスおよびリソースの制限について説明します。
部分的な失敗
ストリーミングでは、パーティションごとにスロットルによって引き起こされる部分的な失敗がサポートされます。部分的な失敗が発生すると、サービスは、200
のステータス・コードを返し、レスポンス・ペイロードで失敗を示します。
リクエスト全体がスロットルされると、ストリーミンは、429
のステータス・コードを返します。
リクエストによって「リクエストが多すぎます」メッセージと429エラーが返される
ストリーミングにリクエストを送信すると、次を含むエラー・メッセージが表示される場合があります:
(429, Too many requests)
このエラーの原因は、サービスのスロットル・メカニズムです。これは、受信しているパーティションごとの1秒当たりのリクエストが多すぎることを示します。
このエラーがプロデューサ側で発生する場合は、1パーティション当たり1MB/秒の合計データ書込み速度を次の方法で超えないようにしてください:
- 1秒当たりのリクエスト数を減らします。
- バッチ処理によってメッセージ・サイズを減らします。
このエラーがコンシューマ側で発生する場合は、次を確認してください:
- カーソルで
commitOnGet(true)
を使用しています。 - リクエスト数を減らす場合、最大データ読取り速度は、コンシューマ・グループ別に1パーティション当たり5 GETリクエスト/秒であることに注意してください。
limit
はGETリクエストごとに設定されています。
リクエストによって「リクエスト・サイズは1MiBに制限されています」メッセージと400エラーが返される
ストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
Exception in thread "main" com.oracle.bmc.model.BmcException: (400, InvalidParameter, false) Request size is limited to 1 MiB. (opc-request-id: <opc_request_id>>)
at com.oracle.bmc.http.internal.ResponseHelper.throwIfNotSuccessful(ResponseHelper.java:120)
at com.oracle.bmc.http.internal.ResponseConversionFunctionFactory$ValidatingParseResponseFunction.apply(ResponseConversionFunctionFactory.java:86)
at com.oracle.bmc.http.internal.ResponseConversionFunctionFactory$ValidatingParseResponseFunction.apply(ResponseConversionFunctionFactory.java:82)
at com.oracle.bmc.streaming.internal.http.PutMessagesConverter$1.apply(PutMessagesConverter.java:68)
at com.oracle.bmc.streaming.internal.http.PutMessagesConverter$1.apply(PutMessagesConverter.java:54)
at com.oracle.bmc.streaming.StreamClient.putMessages(StreamClient.java:466)
このエラーは、サービスに送信されたPutMessages
コールが大きすぎるために発生します。サイズは1MB以下である必要があります。
「許可されたパーティションの数を超えました」メッセージでストリームの作成が失敗する
このエラーは、テナンシで許可されているよりも多くのパーティションを作成しようとしたときに発生します。引上げをリクエストできます。
生成および消費のトラブルシューティング
メッセージがストリームに公開された後にコンソールに表示されない
最初の100メッセージを表示するには、「リフレッシュ」ボタンをクリックする必要があります。詳細は、コンソールを使用した最近のメッセージの表示を参照してください。
プライベート・エンドポイントを使用するストリームはインターネットからアクセスできないため、それらのメッセージはコンソールに表示されます。
コンシューマが「カーソルは保持期間の範囲外で現在は無効です」メッセージと400エラーを受信する
ストリームからメッセージをリクエストすると、コンシューマに次のようなエラー・メッセージが示されることがあります:
(400, InvalidParameter, false) The cursor is outside the retention period and is now invalid
このエラーは、1つ以上のパーティションに格納されているオフセットが、水平トリムより遅れていることを意味します。なんらかのデータ損失が発生しており、ストリームに生成されたデータは消費に使用できなくなりました。保持期間の範囲外のデータはリカバリできません。この時点で、管理者は、ユース・ケースに応じて最適な処理方針を決定する必要があります。
このエラーは、オフセットを定期的にコミットしていない場合や、コンシューマが常に遅延している場合に発生することがあります。詳細は、メッセージの取得を参照してください。
コンシューマ・グループ内のインスタンスのカーソルをリセットするには、UpdateGroup
メソッドへの手動コールが必要です。
コンシューマが「予約されていないパーティションをコミットしようとしています」メッセージと400エラーを受信する
ストリームからメッセージをリクエストすると、コンシューマ・グループの一部であるコンシューマに次のようなエラー・メッセージが示されることがあります:
(400, InvalidParameter, false) Trying to commit unreserved partition
このエラーは、コンシューマがその特定のコンシューマ用に予約されていないパーティションのオフセットをコミットしようとしたことを意味します。このエラーは、コンシューマがタイムアウトしたように見え、パーティションが別のコンシューマにリバランスされた後、コンシューマがオフセットをコミットしようとした場合に発生する可能性があります。コンシューマのデフォルト・タイムアウトは30秒です。コンシューマのタイムアウトは、ハートビートを送信することで延長できます。詳細は、グループとしての消費を参照してください。
このエラーは、パイプライン処理時(commitOnGet=false
)および相当の時間(30秒超)にわたりコミットが行われなかった場合にも発生する可能性があります。
リクエストが「JSON本文を解析できません」メッセージと400エラーで失敗する
ストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
(400, Unable to parse JSON body)
このエラーは通常、JSON本文に無効なフォーマットのエントリが含まれていることを意味します。
Ruby SDKリクエストが「JSON本文を解析できません」メッセージと400エラーで失敗する
Ruby SDKを使用してストリーミングにリクエストを送信すると、次のようなエラー・メッセージが表示される場合があります:
Unable to parse JSON body, 'status': 400, 'code': 'InvalidParameter'
Ruby SDKはエンコーディングを行いません。キーと値のフィールドで送信される文字列をエンコードするには、Base64
を使用する必要があります。例:
msgs << OCI::Streaming::Models::PutMessagesDetailsEntry.new(key: Base64.strict_encode64(k), value: Base64.strict_encode64(record.to_json))
if msgs.length > 0
res = @oss_client.put_messages(@stream_ocid, OCI::Streaming::Models::PutMessagesDetails.new(messages: msgs))
end
ストリーミングおよびKafkaのトラブルシューティング
Kafka Connect構成の作成が失敗する
Kafka Connect構成を作成しようとすると、次のようなエラー・メッセージが表示されることがあります:
You are not authorized to create Kafka Connect Configurations
Kafka Connect構成を作成するには、テナンシで正しいIAMポリシーを作成する必要があります。例:
Allow group xyz to manage connect-harnesses in tenancy
詳細は、Kafka接続構成の管理を参照してください