Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Zu viele Threads in Cloud Pub/Sub

By Joshua FoxJul 5, 20201 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Zusätzliche, inaktive Threads sind in Java grundsätzlich kein Problem. In ressourcenbeschränkten Umgebungen – vor allem dann, wenn Ihre Software ohnehin viele Threads nutzt – können zu viele davon das System jedoch ausbremsen.

Google Cloud PubSub ist ein hervorragendes Framework für asynchrone Kommunikation und gilt als besonders ressourcenschonend. Dennoch legt der Google PubSub Java Client bei der ersten Nutzung 60 Threads an, die dauerhaft aktiv bleiben. (Alle Threads lassen sich per Thread.getAllStackTraces().keySet() auslesen.) Diese zusätzlichen Threads nutzt PubSub für asynchrone Operationen beim Veröffentlichen von Nachrichten.

Zu viele Threads

Bei einem Publisher mit hohem Nachrichtenaufkommen sind die Threads sinnvoll – bei geringem Volumen sind 60 Threads jedoch deutlich zu viel.

Die API zum Festlegen der Thread-Anzahl gehört nicht zur offiziellen PubSub-API, ist schlecht dokumentiert und recht hardwarenah. So gehen Sie trotzdem vor:

1. Setzen Sie setExecutorThreadCount auf einen kleinen Wert wie 4 (oder sogar 1), wie unten gezeigt. Damit verringert sich die Anzahl der Threads um etwa 40.

2. Damit bleiben noch rund 20 inaktive Threads übrig. Diese lassen sich weiter reduzieren – wie von ajaaym auf GitHub beschrieben (Code unten).

Dabei erzeugen Sie Publisher, GrpcTransportProvider und ManagedChannelBuilder mit einem einzigen, gemeinsam genutzten ExecutorProvider mit nur einem Thread. So kommt für den PubSub Publisher insgesamt nur ein einziger Thread hinzu.