Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Le migliori pratiche per i clienti Kafka
Quando si lavora con Apache Kafka e AmazonMSK, è importante configurare correttamente sia il client che il server per prestazioni e affidabilità ottimali. Questa guida fornisce consigli sulla configurazione lato client basata sulle best practice per Amazon. MSK
Per informazioni sulle best practice di Amazon MSK Replicator, consultaLe migliori pratiche per l'utilizzo di MSK Replicator.
Disponibilità del client Kafka
In un sistema distribuito come Apache Kafka, garantire un'elevata disponibilità è fondamentale per mantenere un'infrastruttura di messaggistica affidabile e tollerante ai guasti. I broker andranno offline per eventi pianificati e non pianificati, come aggiornamenti, patch, guasti hardware e problemi di rete. Un cluster Kafka è tollerante nei confronti di un broker offline, pertanto i clienti Kafka devono anche gestire il failover dei broker con garbo. Per garantire un'elevata disponibilità dei clienti Kafka, consigliamo queste best practice.
Disponibilità dei produttori
Impostato
retries
per indicare al produttore di riprovare a inviare messaggi non riusciti durante il failover del broker. Consigliamo un valore intero massimo o un valore elevato simile per la maggior parte dei casi d'uso. In caso contrario, l'elevata disponibilità di Kafka verrà interrotta.Imposta
delivery.timeout.ms
per specificare il limite superiore per il tempo totale tra l'invio di un messaggio e la ricezione di una conferma dal broker. Ciò dovrebbe riflettere i requisiti aziendali relativi alla durata di validità di un messaggio. Imposta il limite di tempo sufficientemente alto da consentire un numero sufficiente di tentativi per completare l'operazione di failover. Si consiglia un valore pari o superiore a 60 secondi per la maggior parte dei casi d'uso.Impostato
request.timeout.ms
al valore massimo, una singola richiesta deve attendere prima di tentare un nuovo invio. Consigliamo un valore pari o superiore a 10 secondi per la maggior parte dei casi d'uso.Imposta
retry.backoff.ms
per configurare il ritardo tra i tentativi per evitare tempeste di tentativi e impatto sulla disponibilità. Consigliamo un valore minimo di 200 ms per la maggior parte dei casi d'uso.Imposta
acks=all
per configurare una durabilità elevata; questo dovrebbe essere in linea con una configurazione lato server diRF=3
emin.isr=2
garantire che tutte le partizioni riconoscano la scrittura. ISR Durante un singolo broker offline, questo è ilmin.isr
, cioè.2
Disponibilità dei consumatori
Impostata
latest
inizialmenteauto.offset.reset
per gruppi di consumatori nuovi o ricreati. In questo modo si evita il rischio di aggiungere carico al cluster consumando l'intero argomento.Impostato
auto.commit.interval.ms
quando si utilizzaenable.auto.commit
. Si consiglia un valore minimo di 5 secondi per la maggior parte dei casi d'uso per evitare il rischio di carico aggiuntivo.Implementa la gestione delle eccezioni all'interno del codice di elaborazione dei messaggi del consumatore per gestire errori transitori, ad esempio un interruttore automatico o una sospensione con back-off esponenziale. In caso contrario, si possono verificare arresti anomali dell'applicazione, con conseguente riequilibrio eccessivo.
Imposta
isolation.level
per controllare la modalità di lettura dei messaggi transazionali:Per impostazione predefinita, consigliamo di impostare sempre in
read_uncommitted
modo implicito. Questo non è presente in alcune implementazioni client.Quando si utilizza lo storage su più livelli,
read_uncommitted
si consiglia un valore pari a.client.rack
Impostare per utilizzare la lettura della replica più vicina. Si consiglia di impostare su per ridurreaz id
al minimo i costi e la latenza del traffico di rete. Consulta Riduci i costi del traffico di rete dei tuoi MSK consumatori Amazon con la consapevolezza dei rack.
I consumatori si riequilibrano
Imposta su
session.timeout.ms
un valore maggiore del tempo di avvio di un'applicazione, incluso qualsiasi jitter di avvio implementato. Consigliamo un valore di 60 secondi per la maggior parte dei casi d'uso.Imposta
heartbeat.interval.ms
per perfezionare il modo in cui il coordinatore del gruppo considera un consumatore sano. Consigliamo un valore di 10 secondi per la maggior parte dei casi d'uso.Imposta un gancio di spegnimento nell'applicazione per chiudere il consumatore senza problemiSIGTERM, anziché affidarti ai timeout delle sessioni per identificare quando un consumatore abbandona un gruppo. Le applicazioni Kstream possono impostare un valore di.
internal.leave.group.on.close
true
Impostato
group.instance.id
su un valore distinto all'interno del gruppo di consumatori. Idealmente un nome host, un task-id o un pod-id. Consigliamo di impostarlo sempre per comportamenti più deterministici e una migliore correlazione tra log client/server durante la risoluzione dei problemi.Impostato su
group.initial.rebalance.delay.ms
un valore in linea con il tempo medio di implementazione. In questo modo si interrompono i ribilanciamenti continui durante l'implementazione.Impostato
partition.assignment.strategy
per utilizzare gli assegnatori permanenti. Consigliamo l'uno o l'altro.StickyAssignor
CooperativeStickyAssignor
Prestazioni del client Kafka
Per garantire prestazioni elevate dei clienti Kafka, consigliamo queste best practice.
Prestazioni del produttore
Impostato
linger.ms
per controllare la quantità di tempo che un produttore attende per il riempimento di un batch. I batch più piccoli sono costosi dal punto di vista computazionale per Kafka in quanto si traducono in più thread e operazioni di I/O contemporaneamente. Consigliamo i seguenti valori.Un valore minimo di 5 ms per tutti i casi d'uso, inclusa la bassa latenza.
Consigliamo un valore più alto di 25 ms, per la maggior parte dei casi d'uso.
Si consiglia di non utilizzare mai un valore pari a zero in casi d'uso a bassa latenza. (Un valore pari a zero in genere causa latenza indipendentemente dal sovraccarico di I/O).
Impostato
batch.size
per controllare la dimensione del batch inviato al cluster. Si consiglia di aumentarlo a un valore di 64 KB o 128 KB.Impostato
buffer.memory
quando si utilizzano batch di dimensioni maggiori. Consigliamo un valore di 64 MB per la maggior parte dei casi d'uso.Impostato
send.buffer.bytes
per controllare il TCP buffer utilizzato per ricevere i byte. Consigliamo un valore pari a -1 per consentire al sistema operativo di gestire questo buffer quando si esegue un produttore su una rete ad alta latenza.Imposta compression.type per controllare la compressione dei batch. Consigliamo lz4 o zstd di eseguire un produttore su una rete ad alta latenza.
Prestazioni per i consumatori
Impostato
fetch.min.bytes
per controllare la dimensione minima di recupero valida per ridurre il numero di recuperi e il carico del cluster.Consigliamo un valore minimo di 32 byte per tutti i casi d'uso.
Si consiglia un valore più alto di 128 byte per la maggior parte dei casi d'uso.
Imposta fetch.max.wait.ms per determinare per quanto tempo il consumatore aspetterà prima che fetch.min.bytes venga ignorato. Consigliamo un valore di 1000 ms per la maggior parte dei casi d'uso.
È consigliabile che il numero di utenti sia almeno uguale al numero di partizioni.
Impostato
receive.buffer.bytes
per controllare il TCP buffer utilizzato per ricevere i byte. Consigliamo un valore pari a -1 per consentire al sistema operativo di gestire questo buffer quando si esegue un consumer su una rete ad alta latenza.
Connessioni client
Il ciclo di vita delle connessioni ha un costo computazionale e di memoria su un cluster Kafka. Troppe connessioni create contemporaneamente causano un carico che può influire sulla disponibilità di un cluster Kafka. Questo impatto sulla disponibilità può spesso portare le applicazioni a creare ancora più connessioni, causando così un errore a cascata, con conseguente interruzione completa. È possibile ottenere un numero elevato di connessioni se create a una velocità ragionevole.
Consigliamo le seguenti mitigazioni per gestire alti tassi di creazione di connessioni:
Assicurati che il meccanismo di distribuzione delle applicazioni non riavvii tutti i produttori/consumatori contemporaneamente, ma preferibilmente in batch più piccoli.
A livello di applicazione, lo sviluppatore deve assicurarsi che venga eseguito un jitter casuale (random sleep) prima di creare un client di amministrazione, un client di produzione o un client consumer.
InoltreSIGTERM, quando si chiude la connessione, è necessario eseguire uno sleep casuale per garantire che non tutti i client Kafka vengano chiusi contemporaneamente. Il sonno casuale deve avvenire entro il timeout precedente al verificarsi. SIGKILL
Esempio A (Java)
sleepInSeconds(randomNumberBetweenOneAndX); this.kafkaProducer = new KafkaProducer<>(this.props);
Esempio B (Java)
Runtime.getRuntime().addShutdownHook(new Thread(() -> { sleepInSeconds(randomNumberBetweenOneAndTwentyFive); kafkaProducer.close(Duration.ofSeconds(5)); });
A livello di applicazione, lo sviluppatore deve assicurarsi che i client vengano creati una sola volta per applicazione secondo uno schema singleton. Ad esempio, quando si utilizza lambda, il client deve essere creato in un ambito globale e non nel gestore del metodo.
Consigliamo di monitorare il numero di connessioni con l'obiettivo di rimanere stabile. creation/close/shiftLa connessione è normale durante le implementazioni e il failover del broker.
Monitoraggio del client Kafka
Il monitoraggio dei clienti Kafka è fondamentale per mantenere la salute e l'efficienza del vostro ecosistema Kafka. Che tu sia un amministratore di Kafka, uno sviluppatore o un membro del team operativo, abilitare le metriche lato client è fondamentale per comprendere l'impatto aziendale durante eventi pianificati e non pianificati.
Ti consigliamo di monitorare le seguenti metriche lato client utilizzando il tuo meccanismo di acquisizione delle metriche preferito.
Quando richiedi assistenza con AWS, includi eventuali valori anomali osservati durante l'incidente. Includi anche un esempio dei log dell'applicazione client che descrivono in dettaglio gli errori (non gli avvisi).
Metriche del produttore
byte-rate
record-send-rate
records-per-request-avg
acks-latency-avg
request-latency-avg
request-latency-max
record-error-rate
record-retry-rate
frequenza di errore
Nota: gli errori transitori relativi ai nuovi tentativi non sono motivo di preoccupazione, in quanto fanno parte del protocollo di Kafka per la gestione di problemi transitori come il failover dei leader o le ritrasmissioni di rete. record-send-rate
confermerà se i produttori stanno ancora procedendo con i nuovi tentativi.
Metriche relative ai consumatori
records-consumed-rate
bytes-consumed-rate
frequenza di recupero
records-lag-max
record-error-rate
fetch-error-rate
tasso di sondaggio
rebalance-latency-avg
tasso di commissione
Nota: tassi di fetch e commit-rate elevati causeranno un carico non necessario sul cluster. È ottimale eseguire richieste in batch più grandi.
Metriche comuni
connection-close-rate
connection-creation-rate
numero di connessioni
Nota: la creazione/terminazione di una connessione elevata causerà un carico non necessario sul cluster.