Risolvere i problemi relativi alle prestazioni di Hub eventi di Azure
Questo articolo offre soluzioni ai problemi di prestazioni comuni che possono verificarsi quando si usa la libreria di Hub eventi in Azure SDK per Java. Se si stanno cercando soluzioni ad altri problemi comuni che possono verificarsi quando si usano Hub eventi, vedere Risoluzione dei problemi Hub eventi di Azure.
Usare processEvent o processEventBatch
Quando si usa il processEvent
callback, ogni EventData
istanza ha ricevuto chiamate al codice. Questo processo funziona bene con traffico basso o moderato nell'hub eventi.
Se l'hub eventi ha traffico elevato e velocità effettiva elevata è previsto, il costo aggregato della chiamata continua del callback impedisce le prestazioni di EventProcessorClient
. In questo caso, è consigliabile usare processEventBatch
.
Per ogni partizione, il callback viene richiamato uno alla volta. Il tempo di elaborazione elevato nel callback ostacola le prestazioni perché EventProcessorClient
non continua a eseguire il push di più eventi downstream né richiedere più EventData
istanze dal servizio Hub eventi.
Costi di checkpoint
Quando si usa Archiviazione BLOB di Azure come archivio checkpoint, è previsto un costo di rete per il checkpoint perché effettua una richiesta HTTP e attende una risposta. Questo processo potrebbe richiedere fino a diversi secondi a causa della latenza di rete, delle prestazioni di Archiviazione BLOB di Azure, della posizione delle risorse e così via.
Il checkpoint dopo l'elaborazione di ogni EventData
istanza impedisce le prestazioni a causa del costo di effettuare queste richieste HTTP. Non è consigliabile creare un checkpoint se il callback non ha elaborato alcun evento oppure è consigliabile eseguire il checkpoint dopo l'elaborazione di un certo numero di eventi.
Usare LoadBalancingStrategy.BALANCED o LoadBalancingStrategy.GRedizione Enterprise DY
Quando si usa LoadBalancingStrategy.BALANCED
, le EventProcessorClient
attestazioni una partizione per ogni ciclo di bilanciamento del carico. Se sono presenti 32 partizioni in un hub eventi, sono necessarie 32 iterazioni di bilanciamento del carico per richiedere tutte le partizioni. Se gli utenti conoscono un numero impostato di EventProcessorClient
istanze in esecuzione, possono usare LoadBalancingStrategy.GREEDY
per richiedere la condivisione delle partizioni in un ciclo di bilanciamento del carico.
Per altre informazioni su ogni strategia, vedere LoadBalancingStrategy.java nel repository azure-sdk-for-java.
Configurare prefetchCount
Il valore di prelettura predefinito è 500. Quando il collegamento di ricezione AMQP viene aperto, inserisce 500 crediti sul collegamento. Supponendo che ogni EventData
istanza sia un credito di collegamento, EventProcessorClient
esegue il prelettura di 500 EventData
istanze. Quando vengono utilizzati tutti gli eventi, il client processore aggiunge 500 crediti al collegamento per ricevere più messaggi. Questo flusso si ripete mentre l'oggetto EventProcessorClient
ha ancora la proprietà di una partizione.
La configurazione prefetchCount
può avere implicazioni sulle prestazioni se il numero è troppo basso. Ogni volta che il servizio remoto AMQP riceve crediti, il servizio remoto invia un ACK. Per scenari con velocità effettiva elevata, il sovraccarico di esecuzione di migliaia di richieste client e ACL del servizio può ostacolare le prestazioni.
La configurazione prefetchCount
può avere implicazioni sulle prestazioni se il numero è troppo elevato. Quando x crediti vengono inseriti nella riga, il servizio Hub eventi sa che può inviare al massimo x messaggi. Quando ogni EventData
istanza viene ricevuta, viene inserita in una coda in memoria, in attesa di essere elaborata. Un numero elevato di EventData
istanze nella coda può comportare un utilizzo di memoria molto elevato.
Passaggi successivi
Se le linee guida per la risoluzione dei problemi in questo articolo non consentono di risolvere i problemi quando si usano le librerie client di Azure SDK per Java, è consigliabile segnalare un problema nel repository GitHub di Azure SDK per Java.