3
votes

Producteur d'accélérateur Kafka basé sur le décalage du consommateur

Existe-t-il un moyen de suspendre ou de ralentir un producteur Kafka en fonction du retard du consommateur ou d'autres problèmes de consommation? Le producteur aurait-il besoin de déterminer lui-même s'il y a un retard du consommateur, puis d'effectuer lui-même la limitation?


1 commentaires

La raison pour laquelle je voudrais suspendre ou ralentir un producteur est que je ne veux pas perdre d'événements si la période de rétention est dépassée ou si l'espace disque est dépassé, donc si je savais en fonction des informations du consommateur de faire une pause, cela aiderait.


3 Réponses :


1
votes

Le producteur et le consommateur sont découplés.

Producer envoie les données aux rubriques Kafka (rubrique partitions), qui sont stockées dans Kafka Brokers. Le producteur ne sait pas qui et à quelle fréquence consomme les messages.

Les consommateurs consomment les données des courtiers. Le consommateur ne sait pas combien de producteurs produisent les messages. Même les mêmes messages peuvent être consommés par plusieurs consommateurs appartenant à des groupes différents. Par exemple, certains consommateurs peuvent consommer plus rapidement que les autres.

Vous pouvez en savoir plus sur Producer et Consommateur dans la page Web Apache Kafka


2 commentaires

Dans mon scénario, je ne veux pas perdre d'événements si la taille du disque est dépassée avant qu'un message ne soit consommé, donc si je devais suspendre le producteur, tous les consommateurs lents peuvent rattraper leur retard. Mais je déduis de vos réponses que ce que je veux n'existe pas.


@mrmannione, Taille du disque, ne peut en aucun cas être obtenue via l'API Kafka. Pour ne pas dépasser la limite du disque, Kafka a des propriétés de temps de rétention, qui peuvent être définies au niveau du courtier ou de la rubrique. La valeur par défaut est de 7 jours, donc si le message est ancien , il sera supprimé du sujet et ne pourra être utilisé par aucun consommateur.



2
votes

Kafka est basé sur la conception Pub / Sub. Le producteur publie le message dans un sujet centralisé. Plusieurs consommateurs peuvent s'abonner à ce sujet. Étant donné que plusieurs consommateurs sont impliqués, vous ne pouvez pas décider de la vitesse du producteur. Un consommateur peut être lent, un autre peut être rapide. Cela va également à l'encontre du principe de conception, sinon les deux systèmes deviendront étroitement couplés. Si vous avez un cas d'utilisation de la limitation, vous devriez évaluer un autre framework comme l'appel direct au repos.


6 commentaires

J'utilise Kafka pour de nombreuses raisons et m'éloigne d'une architecture REST directe, donc me dire de revenir à REST ne répond vraiment pas à ma question. Je suppose que la réponse à ma question est NON, ce que je veux n'est pas possible.


@mrmannione J'ai répondu à votre question et vous ai expliqué la raison pour laquelle cela ne peut pas être fait. La dernière ligne n'était qu'une suggestion. Si vous ne voulez pas le prendre, ignorez-le gracieusement :)


Le problème est que si un consommateur est vraiment lent, il peut manquer des messages en raison de la limite de taille du disque.Dans ce scénario, si le producteur était au courant et a fait une pause jusqu'à ce qu'il rattrape ou jusqu'à ce qu'il soit corrigé et mis à l'échelle, cela me semble être une bonne fonctionnalité .


Pour améliorer le taux de consommation, vous pouvez effectuer une parallélisation. Augmentez le nombre de partitions et faites en sorte que plus de consommateurs écoutent ces partitions.


Dans mon cas, plusieurs consommateurs peuvent partager le même backend qui peut avoir le même problème. Par conséquent, j'ai pensé qu'il serait bon d'avoir un moyen de suspendre le producteur lorsque cela se produit. Je sais que je peux mettre le consommateur en pause, ce que je peux faire, mais ce n’est pas ce que je demande. Il semble que ce que je demande n'est pas possible


Ouais, ce que vous demandez n'est pas possible. Habituellement, les gens y parviennent en augmentant le débit des consommateurs. Une autre idée peut être d'augmenter le ttl pour vos messages. De cette façon, le message restera dans le courtier kafka, le consommateur peut prendre son temps, le producteur peut continuer à produire à son rythme. Mais encore une fois, cela ne fonctionnera pas si le producteur continue de produire au même rythme tout le temps.



2
votes

Il n'est pas possible d'étrangler le producteur / producteurs en pesant sur la performance des consommateurs.

Dans mon scénario, je ne veux pas perdre d'événements si la taille du disque est dépassé avant qu'un message ne soit consommé

Pour résoudre votre problème, vous devez vous fier à l'offre de parallélisme du Kafka. Votre sujet Kafka doit avoir plusieurs partitions et les producteurs doivent utiliser différentes clés pour remplir le sujet. Ainsi, vos données seront réparties sur plusieurs partitions et en apportant un groupe de consommateurs, vous pourrez gérer la charge au sein d'un groupe de consommateurs. Toutes les données d'une partition peuvent être traitées dans l'ordre, ce qui peut être pertinent puisque vous traitez avec le traitement des événements.


1 commentaires

J'ai un problème où même si je redimensionne les consommateurs, un certain nombre de ces consommateurs partagent le même backend et ce backend a parfois des problèmes, donc j'ai pensé qu'il serait bon d'avoir un moyen de suspendre le producteur lorsque cela se produit. Je sais que je peux mettre le consommateur en pause, ce que je peux faire, mais ce n’est pas ce que je demande. Il semble que ce que je demande n'est pas possible.