Apache Kafka ordre des messages avec plusieurs partitions
Comme par Apache Kafka de la documentation, de l'ordre des messages peut être réalisé à l'intérieur de la partition ou une partition dans un sujet. Dans ce cas, qu'est-ce que le parallélisme des avantages que nous obtenons et il est équivalent à la traditionnelle MQs, n'est-ce pas?
C'est un peu comme de dire: Si je mets un synchroniser bloc sur tout mon code, où est le multithreading avantage? Vous pouvez tirer le meilleur parti de kafka parallélisme si vous partitionnez vos données et vous n'avez pas vraiment besoin d'ordre. Si votre cas d'utilisation exige l'utilisation d'une seule partition, alors oui, vous ne verrez pas le parallélisme des avantages, mais ce n'est pas kafka défaut - vous pouvez avoir besoin de repenser votre cas d'utilisation. Je concède qu'il peut y avoir du monde réel de cas d'utilisation qui ne sont pas de bons candidats pour kafka.
Kafka est un système distribué courtier. En tout distribué le courtier de l'ensemble de la commande ne fait pas de sens. Si vous voulez continuer à maintenir l'ensemble de la commande, vous devriez envisager de repenser votre architecture.
Kafka est un système distribué courtier. En tout distribué le courtier de l'ensemble de la commande ne fait pas de sens. Si vous voulez continuer à maintenir l'ensemble de la commande, vous devriez envisager de repenser votre architecture.
OriginalL'auteur Rajan R.G | 2015-04-23
Vous devez vous connecter pour publier un commentaire.
Dans Kafka, le parallélisme est égal au nombre de partitions d'un sujet.
Par exemple, supposons que vos messages sont partitionnées en fonction de user_id et envisager de 4 messages ayant user_ids 1,2,3 et 4. Supposons que vous avez un "utilisateurs" de la rubrique avec 4 partitions.
Depuis le partitionnement est basé sur user_id, supposons que le message ayant user_id 1 go pour la partition 1, message ayant user_id 2 ira à la partition 2 et ainsi de suite..
Supposons également que vous disposez de 4 consommateurs pour le sujet. Puisque vous avez 4 les consommateurs, Kafka va attribuer à chaque consommateur une partition. Dans ce cas, dès que 4 messages sont diffusés, ils sont immédiatement consommés par les consommateurs.
Si vous aviez 2 consommateurs pour le sujet au lieu de 4, puis chaque consommateur en sera de manutention 2 partitions et de les consommer le débit sera près de la moitié.
Pour répondre complètement à votre question,
Kafka seulement fournit un ordre total sur les messages à l'intérieur d'une partition, et non entre les différentes partitions dans une rubrique.
c'est à dire, si la consommation est très lent dans la partition 2 et très rapide dans le cadre de l'ion 4, leur message avec user_id 4 seront consommés avant le message avec user_id 2. C'est de cette façon Kafka est conçu.
Oui il n'y a aucune garantie comme ça. Dans ce cas, vous devrez utiliser une seule partition pour votre sujet et vous perdrez la possibilité de paralléliser. Vous pourriez avoir à repenser le problème en main.
Je pense que vous devriez juste la partition de vos messages correctement lors de la production. Par exemple, vous pouvez partition par user_id et puis vos messages de certains user_id arriverez à une partition spécifique (qui sera toujours le même) et ainsi la garantie que tous les messages pour que user_id va rester dans l'ordre. Vous n'avez pas besoin de maintenir l'ordre entre les différents user_ids, droit?
Pourquoi ne pas vous envisager d'avoir un timestamp dans vos données. Après la consommation de données, vous pouvez trier les données en se basant sur l'horodatage. Essayez de créer un timeseries données afin de préserver l'ordre.
OriginalL'auteur Vishal John
J'ai décidé de passer mon commentaire à la réponse que je pense qu'il est judicieux de le faire.
Alors que John est à 100% sur ce qu'il a écrit, vous pouvez envisager de repenser votre problème. Avez-vous vraiment besoin de TOUS les messages pour rester dans l'ordre? Ou avez-vous besoin tous les messages de certains user_id (ou autre) pour rester dans l'ordre?
Si le premier, alors il n'y a pas beaucoup que vous pouvez faire, vous devez utiliser 1 partition et perdre tout le parallélisme capacité.
Mais si le second cas, vous pourriez envisager de partitionnement de vos messages par certains grands, et donc que tous les messages pour que la clé va arriver à une partition (en fait ils pourraient aller à une autre partition, si vous redimensionnez sujet, mais c'est une autre affaire) et ainsi vous aurez la garantie que tous les messages pour que les clés sont dans l'ordre.
Désolé, je n'ai pas d'expertise dans d'autres MQ que je suis familier avec Kafka. De toute façon je pense que ça dépend de ce que vous avez l'intention de faire avec les données. Il pourrait être un cas lorsque vous devez vérifier d'autres solutions au lieu de Kafka.
OriginalL'auteur serejja
Dans kafka Messages avec le même clé, provenant du même Producteur, sont livrés au Consommateur, afin
une autre chose qui est, de Données au sein d'une Partition seront stockées dans l'ordre dans lequel il est écrit, par conséquent, les données lues à partir d'une Partition sera lu dans l'ordre pour que partition
Donc, si vous voulez obtenir de l'ordre dans vos messages à travers des partitions, alors vous avez vraiment besoin de regrouper vos messages avec une clé, de sorte que les messages avec la même clé va de même partition et partition les messages sont triés.
En un mot, vous aurez besoin pour concevoir deux niveaux de solution, comme ci-dessus, logiquement, pour obtenir les messages commandé multi partition.
OriginalL'auteur Dean Jain
Traditionnel MQ fonctionne d'une manière telle que, une fois un message a été traité, il est supprimé de la file d'attente. Un message de la file d'attente permet à un groupe d'abonnés pour tirer un message, ou un lot de messages, à partir de la fin de la file d'attente. Les files d'attente permettent généralement d'un certain niveau de transaction lors de l'extraction d'un message, pour s'assurer que l'action souhaitée a été exécuté, avant que le message est supprimé, mais une fois qu'un message a été traitée, il est supprimé de la file d'attente.
Avec Kafka sur l'autre main, vous publiez des messages et/ou des événements à thèmes, et ils ont persisté. Ils n'ont pas supprimé lorsque les consommateurs reçoivent. Cette fonction vous permet de relire les messages, mais plus important encore, il permet une multitude de consommateurs à une logique de processus basé sur les mêmes messages/événements.
Vous pouvez toujours échelle pour obtenir un traitement en parallèle dans le même domaine, mais plus important encore, vous pouvez ajouter différents types de consommateurs qui, à exécuter les différentes logiques basées sur le même événement. En d'autres termes, avec Kafka, vous pouvez adopter un réactif pub/sub architecture.
ref: https://hackernoon.com/a-super-quick-comparison-between-kafka-and-message-queues-e69742d855a8
OriginalL'auteur Yash
Vous pouvez envisager d'avoir un champ qui a le Timestamp/Jour au moment de la création de la base de données à la source.
Une fois, les données sont consommées, vous pouvez charger les données dans la base de données. Les données doivent être triées à la base de données avant d'utiliser le jeu de données pour n'importe quel cas d'utilisation. Eh bien, c'est une tentative pour vous aider à penser de multiples façons.
Considérons que nous avons un message clé que le timestamp qui est généré au moment de la création des données et de la valeur est la chaîne de message.
Qu'au moment où un message est capté par le consommateur, le message est écrit dans HBase avec le RowKey comme le kafka de la clé et de la valeur que l'kafka valeur.
Depuis, HBase est une triés carte ayant timestamp comme une clé de trie automatiquement les données dans l'ordre. Ensuite, vous pouvez servir les données HBase pour les applications en aval.
De cette façon, vous n'êtes pas perdre le parallélisme de kafka. Vous avez également le privilège de traitement de tri et de l'exécution de plusieurs de transformation des logiques sur les données au niveau base de données.
Remarque: Toutes distribué message broker ne garantit pas l'ensemble de la commande. Si vous êtes en insistant pour que vous devrez peut-être repenser l'aide d'un autre courtier de message ou vous avez besoin d'avoir une seule partition dans kafka qui n'est pas une bonne idée. Kafka est tout au sujet de parallélisme par l'augmentation de partitions ou de l'augmentation de groupes de défense des consommateurs.
Si vous avez pu lire la réponse, là encore, je l'ai dit trier les données à l'Évier. L'évier peut être une base de données. Lorsque vous êtes à l'aide de kafka, il n'y a aucune garantie que l'ordre est maintenu.
Si l'utilisateur est à la recherche pour toute commande, il ne devrait pas avoir considéré comme un distribué message broker.
OriginalL'auteur wandermonk