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.
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!
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.
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é ...>