同時実行制御は、Pub/Sub の高レベル クライアント ライブラリで使用できる機能です。低レベル ライブラリを使用している場合は、独自の同時実行制御を実装することもできます。
同時実行制御のサポートは、クライアント ライブラリのプログラミング言語によって異なります。C++、Go、Java などの並列スレッドをサポートする言語を実装する場合、クライアント ライブラリはデフォルトのスレッド数を選択します。
しかし、この値がアプリケーションに最適ではない場合もあります。たとえば、サブスクライバー アプリケーションがメッセージの受信量に対応できず、CPU にバインドされていない場合は、スレッド数を増やす必要があります。CPU 使用率の高いメッセージ処理のオペレーションでは、スレッド数を減らすと、問題が解決する場合があります。
このページでは、同時実行制御のコンセプトと、サブスクライバー クライアントにこの機能を設定する方法について説明します。同時実行制御用にパブリッシャー クライアントを構成するには、同時実行制御をご覧ください。
同時実行制御の構成
同時実行制御変数のデフォルト値と変数の名前は、クライアント ライブラリによって異なる場合があります。詳細については、API リファレンス ドキュメントをご覧ください。たとえば、Java クライアント ライブラリでは、同時実行制御を構成するメソッドは setParallelPullCount()
、setExecutorProvider()
、setSystemExecutorProvider()
、setChannelProvider()
です。
setParallelPullCount() を使用すると、開くストリームの数を決定できます。サブスクライバー クライアントが 1 つのストリームで送信されるデータ(10 MBps)よりも多くのデータを処理できる場合は、より多くのストリームを開くことができます。
setExecutorProvider() を使用すると、メッセージの処理に使用するエグゼキュータ プロバイダをカスタマイズできます。たとえば、エグゼキュータ プロバイダを、複数のサブスクライバー クライアントにわたってスレッド数が制限された単一の共有エグゼキュータを返すプロバイダに変更できます。この構成は、作成されるスレッドの数を制限することに役立ちます。同時実行制御に使用されるスレッドの合計数は、クライアント ライブラリで渡されるエグゼキュータ プロバイダと並列 pull 数によって変わります。
setSystemExecutorProvider() を使用すると、リース管理に使用するエグゼキュータ プロバイダをカスタマイズできます。通常、
setExecutorProvider
とsetSystemExecutorProvider
で同じエグゼキュータ プロバイダを使用する場合を除き、この値は構成しません。たとえば、スループットの低いサブスクリプションが多数ある場合は、同じエグゼキュータ プロバイダを使用できます。同じ値を使用すると、クライアント内のスレッド数が制限されます。setChannelProvider() を使用すると、Pub/Sub への接続の開始に使用するチャネル プロバイダをカスタマイズできます。通常、複数のサブスクライバー クライアントで同じチャネルを使用する場合を除き、この値は構成しません。チャネルを多くのクライアントで再利用すると、
GOAWAY
エラーまたはENHANCE_YOUR_CALM
エラーが発生する可能性があります。アプリケーションのログまたは Cloud Logging にこれらのエラーが表示された場合は、チャンネルを追加します。
同時実行制御のコードサンプル
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
次のステップ
サブスクリプションに構成できる他の配信オプションについて確認します。