Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Cloud Pub/Subのスレッドが多すぎる

By Joshua FoxJul 5, 20201 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

一般に、Javaで非アクティブなスレッドが多少余分にあっても問題にはなりません。しかし、リソースに制約のある環境や、すでに多くのスレッドを使用しているソフトウェアの場合、余分なスレッドが増えすぎるとシステムに過剰な負担がかかります。

Google Cloud PubSubは軽量さで知られる優れた非同期通信フレームワークです。ところが、Google PubSubのJavaクライアントを初めて使うと、常時稼働する60個のスレッドが生成されます(すべてのスレッドは Thread.getAllStackTraces().keySet() で確認できます)。これらの追加スレッドは、メッセージ配信に伴う非同期処理のために使われます。

スレッドが多すぎる

大量のメッセージを扱うpublisherにとっては有用なスレッド構成ですが、少量しか扱わないpublisherにとって60個は明らかに過剰です。

スレッド数を調整するAPIは公式のPubSub APIには含まれておらず、ドキュメントも整備されていない、かなり低レベルなものです。そこで、その実現方法を紹介します。

1. 以下のように setExecutorThreadCount を4(あるいは1)など小さな値に設定します。これだけでスレッド数を約40個削減できます。

2. それでも約20個の非アクティブなスレッドが残ります。これらは ajaaym 氏が GitHub で示している方法で削減できます(コードは以下)。

ここでは、PublisherGrpcTransportProviderManagedChannelBuilder を、シングルスレッドで共有する ExecutorProvider から生成します。こうすることで、PubSub Publisherのために追加されるスレッドは合計1つだけになります。