Est Apache Kafka approprié pour une utilisation comme un non-ordonnée de la tâche de la file d'attente?
Kafka divise les messages entrants dans les partitions, selon la partition attribué par le producteur. Messages à partir des partitions obtenir ensuite consommés par les consommateurs dans les différents groupes de consommateurs.
Cette architecture me fait me méfier de l'utilisation de Kafka comme une tâche de la file d'attente, parce que je dois spécifier la partition au moment de la production, ce qui indirectement les limites dans lesquels les consommateurs peuvent travailler en raison d'une partition est envoyé à un seul consommateur dans un groupe de consommateurs. Je préfère ne pas spécifier la partition à l'avance, de sorte que le consommateur est prêt à prendre cette tâche peut le faire. Est-il un moyen de la structure des partitions/producteurs dans un Kafka architecture où les tâches peuvent être retirés par le côté de consommation, sans avoir à diviser le travail à l'avance par le choix d'une partition lorsque le travail est-il produit?
L'aide d'une seule partition pour ce sujet serait de mettre toutes les tâches dans la file d'attente, puis le nombre de consommateurs est limité à 1 par groupe de consommateurs, de sorte que chaque consommateur devrait être dans un groupe différent. Ensuite, l'ensemble de la tâche d'être distribuée à chaque groupe de consommateurs, cependant, ce qui n'est pas le genre de la file d'attente de travail je suis à la recherche d'.
Est Apache Kafka approprié pour une utilisation comme une tâche de la file d'attente?
- Sur une note de côté: votre problème peut être résolu à l'aide d'Apache Pulsar qui a partagé le sujet-consommateur d'abonnement. Voir pulsar.apache.org/docs/latest/getting-started/...
Vous devez vous connecter pour publier un commentaire.
À l'aide de Kafka pour une tâche de la file d'attente est une mauvaise idée.
Utiliser RabbitMQ au lieu de cela, il le fait beaucoup mieux et de manière plus élégante.
Bien que vous pouvez utiliser Kafka pour une tâche de la file d'attente, vous obtiendrez quelques questions:
Kafka ne permet pas de consommer une seule partition par de nombreux consommateurs (par conception), donc si par exemple, une partition est rempli avec de nombreuses tâches et le consommateur, qui est propriétaire de la partition est occupé, les tâches de la partition obtiendrez "la famine".
Cela signifie également que l'ordre de la consommation de tâches dans la rubrique ne sera pas identique à l'ordre de réalisation des tâches qui ont été réalisés, qui pourraient causer de graves problèmes si les tâches doit être consommée dans un ordre spécifique (dans Kafka pour réaliser pleinement que vous devez avoir seulement un consommateur, et une partition - qui signifie en série de la consommation par un seul nœud. Si vous avez plusieurs consommateurs et plusieurs partitions de l'ordre des tâches de la consommation ne sera pas garantie dans la rubrique niveau).
En fait - Kafka sujets ne sont pas les files d'attente dans les sciences de l'informatique manière. File d'attente First in First out - ce n'est pas ce que vous obtenez dans Kafka dans la rubrique niveau.
Un autre problème est qu'il est difficile de modifier le nombre de partitions de façon dynamique. L'ajout ou la suppression de nouveaux travailleurs doit être dynamique. Si vous voulez vous assurer que les nouveaux travailleurs obtiendrez des tâches dans Kakfa vous devez définir le numéro de la partition du maximum possible des travailleurs. Ce n'est pas assez élégant.
De sorte que le bas de ligne - utilisation de RabbitMQ ou d'autres files d'attente à la place.
Ayant dit qu' - Samza (par linkedin) est à l'aide de kafka comme une sorte de diffusion en fonction de la tâche de la file d'attente:
Samza
Edit:
l'échelle de considérations: j'ai oublié de mentionner que Kakfa est un big data/big échelle de l'outil. Si votre taux est énorme alors Kafka pourrait être la bonne option pour vous, malgré les choses que j'ai écrit plus tôt, depuis le traitement de gigantesque échelle est très difficile et Kafka est très bon dans ce qu'. Si nous parlons des échelles plus petites (jusqu'à quelques dosens/des centaines d'emplois par seconde) puis à nouveau Kafka est un mauvais choix par rapport à RabbitMQ.
Je dirais que cela dépend de l'échelle. Combien de tâches prévoyez-vous dans une unité de temps?
Ce que vous décrivez comme votre but final est essentiellement la manière de Kafka qui fonctionne par défaut.
Lorsque vous produisez des messages par défaut (le plus largement utilisé) option consiste à utiliser aléatoires partitionnement, qui choisit les partitions dans le round robin de la mode, en gardant les partitions utilisé de manière uniforme (il est donc possible pour éviter de spécifier une partition).
Le but principal de partitions est de paralléliser le traitement de messages, de sorte que vous devriez l'utiliser de cette manière.
D'autres couramment utilisés "chose" que les partitions sont utilisés pour se assurer que certains messages sont consommés dans le même ordre qu'elles sont produites (ensuite, vous spécifiez le partitionnement de la clé de telle manière que tous ces messages se retrouvent dans la même partition. E. g. à l'aide de
userId
comme clé assurer que tous les utilisateurs sont traitées dans une telle manière).Il y a beaucoup de discussion à ce sujet tournant autour de l'ordre d'exécution des tâches dans un travail ou une tâche de la file d'attente. Je voudrais mettre en avant l'idée que l'ordre d'exécution ne doit pas être un élément d'une file d'attente de travail.
Une file d'attente de travail est un moyen de contrôler l'utilisation des ressources par l'application d'une contrôlable nombre de threads de travail en vue de la finalisation de tâches distinctes. L'application d'un ordre de traitement sur les tâches en file d'attente signifie que vous êtes également l'application d'un achèvement de l'ordre sur les tâches dans la file d'attente, ce qui signifie que les tâches dans la file d'attente serait toujours traitées de manière séquentielle avec la prochaine tâche en cours de traitement seulement après la FIN de la tâche précédente. Cela signifie que vous avez un seul thread tâche de la file d'attente.
Si l'ordre d'exécution est important dans certaines de vos tâches, ces tâches devraient ajouter la tâche suivante dans la séquence de la file d'attente de travail après son achèvement. Ou alors vous prenez en charge un Séquentiel type de Travail qui, lorsqu'elles sont traitées les processus en fait, la liste des emplois de façon séquentielle sur un travailleur.
Ne devrait en aucun cas la file d'attente de travail effectivement l'ordre tout de son travail - le prochain processeur doit toujours prendre la prochaine tâche avec aucune quant à ce qui s'est produit avant ou après la fin de la tâche.
J'étais également à la recherche de kafka comme une base pour une file d'attente de travail, mais plus je la recherche, le moins qu'il ressemble à la plate-forme désirée.
Je vois, il est principalement utilisé comme un moyen de synchroniser des ressources différentes et non pas comme un moyen de l'exécution disparates à des demandes de travail.
Un autre domaine qui, je pense, est important dans une file d'attente de travail est la prise en charge de l'ordre de priorité des tâches. Par exemple, si j'ai 20 tâches dans la file d'attente, et un nouveau groupe arrive avec une priorité plus élevée, je veux que la tâche d'aller au début de la ligne pour être ramassé par un autre travailleur. Kafka ne permettrait pas à cette.
Il existe deux principaux obstacles en essayant d'utiliser Kafka comme une file d'attente de messages:
comme décrit dans Ofer réponse, vous pouvez ne consommer qu'une seule partition à partir d'un seul consommateur, et l'ordre de traitement est garanti que dans une partition. Donc, si vous ne pouvez pas répartir les tâches de façon équitable à travers des partitions, cela pourrait être un problème
par défaut, vous ne pouvez reconnaître le traitement de tous les messages jusqu'à un point donné (offset). Contrairement aux traditionnelles files d'attente de messages, vous ne pouvez pas faire sélective accusé de réception et, en cas d'échec, sélective tentatives. Cela peut être l'adresse en utilisant kmq, ce qui ajoute de la personne accusés de réception de la capacité avec l'aide d'un autre sujet (disclaimer: je suis l'auteur de kmq).
RabbitMQ est une alternative, bien sûr, mais il donne également différente (inférieure) de la performance et de la réplication des garanties. En bref, RabbitMQ docs état que le courtier n'est pas la partition tolérant. Voir aussi notre comparatif des files d'attente de messages avec la réplication de données, mqperf.