web-dev-qa-db-fra.com

Comprendre la propriété max.inflight de kafka producteur

Je travaille sur un banc de mon cluster Kafka dans la version 1.0.0-cp1.

Dans une partie de mon banc qui se concentre sur le débit maximum possible avec une garantie de commande et aucune perte de données (un sujet avec une seule partition), dois-je définir le max.in.flight.requests.per.connection propriété à 1?

J'ai lu cet article

Et je comprends que je dois uniquement définir le vol max en pouces sur 1 si j'active la fonction de nouvelle tentative chez mon producteur avec la propriété retries.

Une autre façon de poser ma question: une seule partition + relances = 0 (accessoires producteurs) est suffisante pour garantir la commande en Kafka?

J'ai besoin de savoir parce que l'augmentation du vol max.in.augmente considérablement le débit.

9
Quentin Geff

Votre cas d'utilisation n'est pas clair. Vous mentionnez la commande et aucune perte de données, mais ne spécifiez pas si vous tolérez les messages en double. Il est donc impur si vous voulez au moins une fois (QoS 1) ou exactement une fois

Quoi qu'il en soit, comme vous utilisez 1.0.0 et n'utilisez qu'une seule partition, vous devriez jeter un œil à Idempotent Producer au lieu de modifier les configurations de Producer. Il permet de garantir correctement et efficacement la commande et aucune perte de données.

De la documentation:

La remise idempotente garantit que les messages sont remis exactement une fois à une partition de sujet particulière pendant la durée de vie d'un seul producteur.

Le premier producteur idempotent forçait max.in.flight.requests.per.connection à 1 (pour les mêmes raisons que vous avez mentionnées), mais dans les dernières versions, il peut désormais être utilisé avec max.in.flight.requests.per.connection fixé à 5 et conserve ses garanties.

En utilisant Idempotent Producer, vous obtiendrez non seulement une sémantique de livraison plus forte (exactement une fois au lieu d'au moins une fois), mais elle pourrait même mieux fonctionner!

Je vous recommande de vérifier la sémantique de livraison dans les documents

Retour à votre question

Oui sans le producteur idempotent (ou transactionnel), si vous voulez éviter la perte de données (QoS 1) et préserver la commande, vous devez définir max.in.flight.requests.per.connection à 1, autorisez retries et utilisez acks=all. Comme vous l'avez vu, cela a un coût de performance important.

12
Mickael Maison

Oui, vous devez définir le max.in.flight.requests.per.connection propriété à 1. Dans l'article que vous avez lu, c'était une erreur initiale (actuellement corrigée) où l'auteur a écrit:

max.in.flights.requests.per.session

qui n'existe pas dans la documentation Kafka.

Cet errata provient probablement du livre "Kafka The Definitive Guide" (1ère édition) où vous pouvez lire dans la page 52:

<... donc si garantir la commande est critique, nous vous recommandons de définir in.flight.requests.per.session=1 pour vous assurer que pendant la relance d'un lot de messages, aucun message supplémentaire ne sera envoyé ...>

2
zamora14