On m'a demandé d'évaluer RabbitMQ au lieu de Kafka, mais j'ai eu du mal à trouver une raison pour laquelle il fait quelque chose de mieux que Kafka. Est-ce que quelqu'un sait s'il est vraiment meilleur en termes de débit, de durabilité, de latence ou de facilité d'utilisation?
333
Réponses:
RabbitMQ est un courtier de messages solide et polyvalent qui prend en charge plusieurs protocoles tels que AMQP, MQTT, STOMP, etc. Il peut gérer un débit élevé. Un cas d'utilisation courant pour RabbitMQ est de gérer des tâches d'arrière-plan ou des tâches de longue durée, telles que la numérisation de fichiers , la mise à l'échelle d'images ou la conversion PDF. RabbitMQ est également utilisé entre les microservices, où il sert de moyen de communication entre les applications, évitant les goulots d'étranglement lors de la transmission des messages.
Kafka est un bus de messages optimisé pour les flux de données à forte pénétration et la relecture. Utilisez Kafka lorsque vous avez besoin de déplacer une grande quantité de données, de traiter des données en temps réel ou d'analyser des données sur une période de temps. En d'autres termes, où les données doivent être collectées, stockées et traitées. Un exemple est lorsque vous souhaitez suivre l'activité des utilisateurs sur une boutique en ligne et générer des articles suggérés à acheter. Un autre exemple est l'analyse des données pour le suivi, l'ingestion, la journalisation ou la sécurité.
Kafka peut être considéré comme un courtier de messages durable où les applications peuvent traiter et retraiter les données diffusées sur disque. Kafka a une approche de routage très simple. RabbitMQ propose de meilleures options si vous devez acheminer vos messages de manière complexe vers vos consommateurs. Utilisez Kafka si vous devez prendre en charge des consommateurs par lots qui pourraient être hors ligne ou des consommateurs qui souhaitent des messages à faible latence.
Afin de comprendre comment lire les données de Kafka, nous devons d'abord comprendre ses consommateurs et ses groupes de consommateurs. Les partitions vous permettent de paralléliser un sujet en répartissant les données sur plusieurs nœuds. Chaque enregistrement d'une partition est attribué et identifié par son décalage unique. Ce décalage pointe vers l'enregistrement dans une partition. Dans la dernière version de Kafka, Kafka conserve un décalage numérique pour chaque enregistrement dans une partition. Un consommateur de Kafka peut soit valider automatiquement des compensations périodiquement, soit choisir de contrôler manuellement cette position validée. RabbitMQ conservera tous les états concernant les messages consommés / reconnus / non acquittés. Je trouve Kafka plus complexe à comprendre que le cas de RabbitMQ, où le message est simplement supprimé de la file d'attente une fois qu'il a été acquitté.
Les files d'attente de RabbitMQ sont plus rapides lorsqu'elles sont vides, tandis que Kafka conserve de grandes quantités de données avec très peu de frais généraux - Kafka est conçu pour contenir et distribuer de gros volumes de messages. (Si vous prévoyez d'avoir de très longues files d'attente dans RabbitMQ, vous pouvez consulter les files d'attente paresseuses .)
Kafka est construit à partir de zéro avec une mise à l'échelle horizontale (mise à l'échelle en ajoutant plus de machines), tandis que RabbitMQ est principalement conçu pour une mise à l'échelle verticale (mise à l'échelle en ajoutant plus de puissance).
RabbitMQ possède une interface conviviale intégrée qui vous permet de surveiller et de gérer votre serveur RabbitMQ à partir d'un navigateur Web. Entre autres choses, les files d'attente, les connexions, les canaux, les échanges, les utilisateurs et les autorisations des utilisateurs peuvent être gérés - créés, supprimés et répertoriés dans le navigateur et vous pouvez surveiller les taux de messages et envoyer / recevoir des messages manuellement. Kafka dispose d'un certain nombre d' outils open-source, ainsi que d'une partie commerciale une fois , offrant les fonctionnalités d'administration et de surveillance. Je dirais que c'est plus facile / plus rapide d'avoir une bonne compréhension de RabbitMQ.
Plus de lecture et quelques données de comparaison peuvent être trouvées ici: https://www.cloudamqp.com/blog/2019-12-12-when-to-use-rabbitmq-or-apache-kafka.html
Recommandant également le document de l'industrie: "Kafka versus RabbitMQ: une étude comparative de deux implémentations de publication / abonnement de référence de l'industrie": http://dl.acm.org/citation.cfm?id=3093908
Je travaille dans une entreprise fournissant à la fois Apache Kafka et RabbitMQ as a Service.
la source
J'entends cette question chaque semaine ... Alors que RabbitMQ (comme IBM MQ ou JMS ou d'autres solutions de messagerie en général) est utilisé pour la messagerie traditionnelle, Apache Kafka est utilisé comme plateforme de streaming (messagerie + stockage distribué + traitement des données). Les deux sont conçus pour différents cas d'utilisation.
Vous pouvez utiliser Kafka pour la «messagerie traditionnelle», mais pas MQ pour les scénarios spécifiques à Kafka.
L'article « Apache Kafka contre Enterprise Service Bus (ESB) - Amis, ennemis ou ennemis? ( https://www.confluent.io/blog/apache-kafka-vs-enterprise-service-bus-esb-friends-enemies-or-frenemies/ ) »explique pourquoi Kafka n'est pas compétitif mais complémentaire des solutions d'intégration et de messagerie (y compris RabbitMQ) et comment intégrer les deux.
la source
5 Différences majeures entre Kafka et RabbitMQ, client qui les utilise:
Quel système de messagerie choisir ou devrions-nous changer notre système de messagerie existant?
Il n'y a pas de réponse unique à la question ci-dessus. Une approche possible à l' examen lorsque vous devez décider quel système de messagerie ou si vous changez le système existant est de « Évaluer la portée et le coût »
la source
RabbitMQ est un système de messagerie push basé sur une différence critique que vous avez oublié, alors que Kafka est un système de messagerie pull. Ceci est important dans le scénario où le système de messagerie doit satisfaire des types disparates de consommateurs avec différentes capacités de traitement. Avec le système basé sur Pull, le consommateur peut consommer en fonction de sa capacité, les systèmes push poussant les messages indépendamment de l'état du consommateur, ce qui met le consommateur à risque.
la source
RabbitMQ est un courtier de messages traditionnel à usage général. Il permet aux serveurs Web de répondre rapidement aux demandes et de transmettre des messages à plusieurs services. Les éditeurs peuvent publier des messages et les mettre à disposition des files d'attente, afin que les consommateurs puissent les récupérer. La communication peut être asynchrone ou synchrone.
D'un autre côté, Apache Kafka n'est pas seulement un courtier de messages. Il a été initialement conçu et mis en œuvre par LinkedIn afin de servir de file d'attente de messages. Depuis 2011, Kafka est open source et a rapidement évolué en une plate-forme de streaming distribuée, qui est utilisée pour la mise en œuvre de pipelines de données en temps réel et d'applications de streaming.
Les organisations modernes disposent de divers pipelines de données qui facilitent la communication entre les systèmes ou les services. Les choses se compliquent un peu lorsqu'un nombre raisonnable de services doit communiquer entre eux en temps réel.
L'architecture devient complexe car diverses intégrations sont nécessaires pour permettre l'intercommunication de ces services. Plus précisément, pour une architecture qui englobe m services source et n services cibles, nxm intégrations distinctes doivent être écrites. De plus, chaque intégration est livrée avec une spécification différente, ce qui signifie que l'on peut avoir besoin d'un protocole différent (HTTP, TCP, JDBC, etc.) ou d'une représentation de données différente (binaire, Apache Avro, JSON, etc.), ce qui rend les choses encore plus difficiles . En outre, les services sources peuvent gérer l'augmentation de la charge des connexions, ce qui pourrait avoir un impact sur la latence.
Apache Kafka conduit à des architectures plus simples et plus faciles à gérer, en découplant les pipelines de données. Kafka agit comme un système distribué à haut débit où les services sources poussent des flux de données, les rendant disponibles pour les services cibles pour les extraire en temps réel.
De plus, de nombreuses interfaces utilisateur open-source et au niveau de l'entreprise pour la gestion des clusters Kafka sont disponibles maintenant. Pour plus de détails se référer à mes articles Présentation des outils de surveillance de l'interface utilisateur pour les clusters Apache Kafka et Pourquoi Apache Kafka?
La décision de choisir RabbitMQ ou Kafka dépend des exigences de votre projet. En général, si vous voulez un courtier de messages pub-sub simple / traditionnel, optez pour RabbitMQ. Si vous souhaitez créer une architecture pilotée par les événements au-dessus de laquelle votre organisation agira sur les événements en temps réel, optez pour Apache Kafka car il fournit plus de fonctionnalités pour ce type d'architecture (par exemple Kafka Streams ou ksqlDB).
la source
Je sais qu'il est un peu tard et peut-être que vous l'avez déjà dit indirectement, mais encore une fois, Kafka n'est pas du tout une file d'attente, c'est un journal (comme quelqu'un l'a dit ci-dessus, basé sur un sondage).
Pour faire simple, le cas d'utilisation le plus évident lorsque vous devriez préférer RabbitMQ (ou toute techno de file d'attente) à Kafka est le suivant:
Vous avez plusieurs consommateurs consommant à partir d'une file d'attente et chaque fois qu'il y a un nouveau message dans la file d'attente et un consommateur disponible, vous souhaitez que ce message soit traité. Si vous regardez de près le fonctionnement de Kafka, vous remarquerez qu'il ne sait pas comment le faire, en raison de la mise à l'échelle de la partition, vous aurez un consommateur dédié à une partition et vous rencontrerez un problème de famine. Problème qui est facilement évité en utilisant une simple techno de file d'attente. Vous pouvez penser à utiliser un thread qui enverra les différents messages de la même partition, mais encore une fois, Kafka n'a pas de mécanisme d'accusé de réception sélectif.
Le mieux que vous puissiez faire est de faire comme ces gars-là et d'essayer de transformer Kafka en file d'attente: https://github.com/softwaremill/kmq
Yannick
la source
Utilisez RabbitMQ lorsque:
En bref: RabbitMQ convient aux cas d'utilisation simples, avec un faible trafic de données, avec l'avantage d'une file d'attente prioritaire et d'options de routage flexibles. Pour des données massives et un débit élevé, utilisez Kafka.
la source
Je vais fournir une réponse objective basée sur mon expérience avec les deux, je vais également sauter la théorie derrière eux, en supposant que vous le savez déjà et / ou d'autres réponses ont déjà fourni suffisamment.
RabbitMQ : Je choisirais celui-ci si mes exigences sont assez simples pour gérer la communication système via les canaux / files d'attente, la rétention et le streaming ne sont pas une exigence. Par exemple, lorsque le système de fabrication a construit l'actif, il informe le système d'accord de configurer les contrats, etc.
Kafka : exigence de sourcing d'événements principalement, lorsque vous devez traiter des flux (parfois infinis), une énorme quantité de données à la fois correctement équilibrées, rejouer les décalages afin de garantir un état donné, etc. Gardez à l'esprit que cette architecture apporte également plus de complexité, car elle inclut des concepts tels que les sujets / partitions / courtiers / messages tombstone, etc. comme une importance de première classe.
la source
Le seul avantage auquel je peux penser est la fonctionnalité transactionnelle, le reste peut être fait en utilisant Kafka
la source
La mise à l'échelle des deux est difficile d'une manière distribuée tolérante aux pannes, mais je dirais que c'est beaucoup plus difficile à grande échelle avec RabbitMQ. Il n'est pas trivial de comprendre Shovel, Federation, Mirrored Msg Queues, ACK, Mem issues, Fault tollerance etc. Cela dit, vous obtenez un échange polyglotte avec RMQ, ce qui n'est pas le cas avec Kafka. Si vous souhaitez diffuser, utilisez Kafka. Si vous souhaitez une IoT simple ou une livraison de paquets à volume élevé similaire, utilisez Kafka. Il s'agit de consommateurs intelligents. Si vous voulez une flexibilité msg et une fiabilité plus élevée avec des coûts plus élevés et éventuellement une certaine complexité, utilisez RMQ.
la source
Si vous avez des besoins de routage complexes et que vous souhaitez une interface graphique intégrée pour surveiller le courtier, alors RabbitMQ peut être le mieux adapté à votre application. Sinon, si vous recherchez un courtier de messages pour gérer un débit élevé et fournir un accès à l'historique des flux, Kafka est probablement le meilleur choix.
la source
Apache Kafka est un choix populaire pour alimenter les pipelines de données. Apache kafka a ajouté un flux kafka pour prendre en charge les cas d'utilisation populaires etl. KSQL simplifie la transformation des données dans le pipeline, en préparant les messages à atterrir proprement dans un autre système. KSQL est le moteur SQL de streaming pour Apache Kafka. Il fournit une interface SQL interactive conviviale mais puissante pour le traitement de flux sur Kafka, sans avoir besoin d'écrire du code dans un langage de programmation tel que Java ou Python. KSQL est évolutif, élastique, tolérant aux pannes et en temps réel. Il prend en charge un large éventail d'opérations de streaming, notamment le filtrage des données, les transformations, les agrégations, les jointures, le fenêtrage et la mise en session.
https://docs.confluent.io/current/ksql/docs/index.html
Rabbitmq n'est pas un choix populaire pour les systèmes etl plutôt que pour les systèmes où il nécessite des systèmes de messagerie simples avec moins de débit.
la source
Je me rends compte que c'est une vieille question, mais un scénario où RabbitMQ pourrait être un meilleur choix est lorsqu'il s'agit de la rédaction de données.
Avec RabbitMQ, par défaut, une fois le message consommé, il est supprimé. Avec Kafka, par défaut, les messages sont conservés pendant une semaine. Il est courant de définir cela sur une durée beaucoup plus longue, voire de ne jamais les supprimer.
Bien que les deux produits puissent être configurés pour conserver (ou ne pas conserver) les messages, si la conformité CCPA ou GDPR est un problème, j'irais avec RabbitMQ.
la source
Kafka est meilleur que RabbitMQ en termes de débit, de durabilité et de latence. Si vous attendez moins de 10 000 transactions par seconde, vous pouvez opter pour RabbitMQ, mais cela dépend aussi de votre implémentation.
J'ai implémenté Kafka dans notre produit où nous traitions plus de 70 000 transactions par seconde et la latence était en moyenne de 15 ms avec quelques pics atteignant jusqu'à 40 ms. La taille du sujet était de 100 Ko.
PFB plus de points de données sur KAFKA et RabbitMQ: Apache Kafka comprend le courtier lui-même, qui est en fait la partie la plus connue et la plus populaire de celui-ci, et a été conçu et commercialisé de manière proéminente vers des scénarios de traitement de flux. En plus de cela, Apache Kafka a récemment ajouté Kafka Streams qui se positionne comme une alternative aux plateformes de streaming telles que Apache Spark, Apache Flink, Apache Beam / Google Cloud Data Flow et Spring Cloud Data Flow. La documentation fait un bon travail de discussion des cas d'utilisation populaires comme le suivi d'activité du site Web, les métriques, l'agrégation de journaux, le traitement de flux, la recherche d'événements et les journaux de validation. L'un de ces cas d'utilisation qu'il décrit est la messagerie, qui peut générer une certaine confusion. Décompressons-le un peu et clarifions les scénarios de messagerie les mieux adaptés à Kafka, comme:
Flux de A à B sans routage complexe, avec un débit maximal (100k / sec +), livré en ordre partitionné au moins une fois. Lorsque votre application a besoin d'accéder à l'historique du flux, livré dans un ordre partitionné au moins une fois. Kafka est un magasin de messages durable et les clients peuvent obtenir une «relecture» du flux d'événements à la demande, contrairement aux courtiers de messages plus traditionnels où une fois qu'un message a été remis, il est supprimé de la file d'attente. Stream Processing Event Sourcing RabbitMQ est une solution de messagerie à usage général, souvent utilisée pour permettre aux serveurs Web de répondre rapidement aux demandes au lieu d'être forcé d'effectuer des procédures gourmandes en ressources pendant que l'utilisateur attend le résultat. C'est également bon pour distribuer un message à plusieurs destinataires pour la consommation ou pour équilibrer les charges entre les travailleurs sous forte charge (20k + / sec). Lorsque vos besoins dépassent le débit, RabbitMQ a beaucoup à offrir: des fonctionnalités pour une livraison fiable, un routage, une fédération, une haute disponibilité, des outils de gestion et d'autres fonctionnalités. Examinons mieux certains scénarios pour RabbitMQ, comme:
Votre application doit fonctionner avec n'importe quelle combinaison de protocoles existants tels que AMQP 0-9-1, STOMP, MQTT, AMQP 1.0. Vous avez besoin d'un contrôle / garanties de cohérence plus précis sur une base par message (files d'attente de lettres mortes, etc.) Cependant, Kafka a récemment ajouté un meilleur support pour les transactions. Votre application a besoin de variété dans la messagerie point à point, de demande / réponse et de publication / abonnement. Routage complexe vers les consommateurs, intégrez plusieurs services / applications avec une logique de routage non triviale. l'aide de logiciels supplémentaires. RabbitMQ est souvent utilisé avec Apache Cassandra lorsque l'application a besoin d'accéder à l'historique des flux, ou avec le plugin LevelDB pour les applications qui ont besoin d'une file d'attente «infinie», mais aucune des fonctionnalités n'est livrée avec RabbitMQ lui-même.
la source
La réponse courte est "accusé de réception de message". RabbitMQ peut être configuré pour exiger des accusés de réception de message. Si un récepteur échoue, le message revient dans la file d'attente et un autre récepteur peut réessayer. Bien que vous puissiez accomplir cela dans Kafka avec votre propre code, cela fonctionne avec RabbitMQ prêt à l'emploi.
D'après mon expérience, si vous avez une application qui a des exigences pour interroger un flux d'informations, Kafka et KSql sont votre meilleur pari. Si vous voulez un système de mise en file d'attente, vous êtes mieux avec RabbitMQ.
la source
La réponse la plus votée couvre la plupart du temps mais je voudrais mettre en lumière le point de vue du cas d'utilisation. Kafka peut-il faire ce que le lapin mq peut faire, la réponse est oui, mais le lapin mq peut faire tout ce que le kafka fait, la réponse est non. Alors, qu'est-ce que le lapin mq ne peut pas faire qui distingue kafka, c'est-à-dire le traitement des messages distribués. Avec cela, relisez maintenant la réponse la plus votée et cela aura plus de sens. Pour élaborer, prenez un cas d'utilisation où vous devez créer un système de messagerie qui a un débit très élevé, par exemple "likes" dans Facebook et vous avez choisi rabbit mq pour cela. Vous avez créé un échange et une file d'attente et un consommateur où tous les éditeurs (dans ce cas, les utilisateurs FB) peuvent publier des messages «J'aime». Étant donné que votre débit est élevé, vous allez créer plusieurs threads dans le consommateur pour traiter les messages en parallèle, mais vous êtes toujours limité par la capacité matérielle de la machine sur laquelle le consommateur s'exécute. En supposant qu'un seul consommateur ne suffit pas pour traiter tous les messages - que feriez-vous? Pouvez-vous ajouter un consommateur supplémentaire à la file d'attente - non, vous ne pouvez pas le faire. Pouvez-vous créer une nouvelle file d'attente et lier cette file d'attente à un échange qui publie un message «J'aime», la réponse n'est pas une raison pour laquelle vous aurez deux fois traité les messages. C'est le problème central que Kafka résout. Il vous permet de créer des partitions distribuées (Queue in rabbit mq) et des consommateurs distribués qui se parlent. Cela garantit que vos messages dans un sujet obtiennent des processus par des consommateurs distribués dans différents nœuds (Machines). Les courtiers Kafka s'assurent que la charge des messages est équilibrée sur toutes les partitions de ce sujet. Le groupe de consommateurs s'assure que tous les consommateurs se parlent et que le message n'est pas traité deux fois. Mais dans la vraie vie, vous ne rencontrerez pas ce problème à moins que votre résultat ne soit sérieusement élevé, car le lapin mq peut également traiter les données très rapidement, même avec un seul consommateur.
la source