{"id":52525,"date":"2019-11-10T00:00:00","date_gmt":"2019-11-09T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah"},"modified":"2020-02-18T14:00:16","modified_gmt":"2020-02-18T11:00:16","slug":"rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah","title":{"rendered":"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/d8e584d210a6a016a962ad6f956a2078.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa r\u00e9silience et la haute disponibilit\u00e9 sont des sujets importants, c'est pourquoi nous consacrerons des articles distincts \u00e0 RabbitMQ et \u00e0 Kafka. Cet article est consacr\u00e9 \u00e0 RabbitMQ, tandis que le suivant portera sur Kafka, en le comparant \u00e0 RabbitMQ. L'article est long, alors installez-vous confortablement.<\/p>\n<p>Examinons les strat\u00e9gies de r\u00e9silience, de coh\u00e9rence et de haute disponibilit\u00e9 (HA), ainsi que les compromis \u00e0 accepter dans chaque strat\u00e9gie. RabbitMQ peut fonctionner sur un cluster de n\u0153uds, le classant ainsi comme un syst\u00e8me distribu\u00e9. Lorsqu'il s'agit de syst\u00e8mes distribu\u00e9s, nous parlons souvent de coh\u00e9rence et de disponibilit\u00e9. <\/p>\n<p>Ces concepts d\u00e9crivent comment le syst\u00e8me se comporte en cas de d\u00e9faillance. Une d\u00e9faillance de la connexion r\u00e9seau, un plantage du serveur, une d\u00e9faillance du disque dur, une indisponibilit\u00e9 temporaire du serveur due \u00e0 une collecte de d\u00e9chets, une perte de paquets ou un ralentissement de la connexion. Tout cela peut entra\u00eener une perte de donn\u00e9es ou des conflits. Il s'av\u00e8re qu'il est presque impossible de construire un syst\u00e8me qui soit \u00e0 la fois compl\u00e8tement coh\u00e9rent (sans perte de donn\u00e9es, sans divergences de donn\u00e9es) et disponible (acceptant des op\u00e9rations de lecture et d'\u00e9criture) pour toutes les d\u00e9faillances.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nNous verrons que la coh\u00e9rence et la disponibilit\u00e9 se situent \u00e0 des extr\u00e9mit\u00e9s oppos\u00e9es du spectre, et vous devez choisir dans quelle direction optimiser. La bonne nouvelle est qu'avec RabbitMQ, ce choix est possible. Vous disposez de \u00ab manettes de nerd \u00bb pour ajuster l'\u00e9quilibre en faveur d'une plus grande coh\u00e9rence ou d'une plus grande disponibilit\u00e9.<\/p>\n<p>Nous mettrons particuli\u00e8rement l'accent sur les configurations qui entra\u00eenent une perte de donn\u00e9es en raison des accus\u00e9s de r\u00e9ception. Il existe une cha\u00eene de responsabilit\u00e9 entre les \u00e9diteurs, les courtiers et les consommateurs. Une fois qu'un message a \u00e9t\u00e9 remis au courtier, c'est son travail de ne pas perdre ce message. Lorsque le courtier accuse r\u00e9ception de la r\u00e9ception d'un message \u00e0 l'\u00e9diteur, nous ne nous attendons pas \u00e0 ce qu'il soit perdu. Mais nous verrons que cela peut vraiment se produire en fonction de la configuration de votre courtier et de votre \u00e9diteur.<\/p>\n<h1>Primitifs de r\u00e9silience d'un seul n\u0153ud<\/h1>\n<p><\/p>\n<h3>Queues de r\u00e9silience \/ routage<\/h3>\n<p>\nDans RabbitMQ, il existe deux types de files d'attente : les files d'attente durables (durable) et non durables (non-durable). Toutes les files d'attente sont sauvegard\u00e9es dans la base de donn\u00e9es Mnesia. Les files d'attente durables sont r\u00e9annonc\u00e9es lors du d\u00e9marrage du n\u0153ud et, par cons\u00e9quent, survivent \u00e0 un red\u00e9marrage, \u00e0 une panne syst\u00e8me ou \u00e0 un \u00e9chec du serveur (tant que les donn\u00e9es sont conserv\u00e9es). Cela signifie que tant que vous d\u00e9clarez le routage (exchange) et la file d'attente comme durables, l'infrastructure des files d'attente \/ routage passera en mode op\u00e9rationnel.<\/p>\n<p>Les files d'attente non durables et le routage sont supprim\u00e9s lors du red\u00e9marrage du n\u0153ud.<\/p>\n<h3>Messages durables<\/h3>\n<p>\nLe fait qu'une file d'attente soit durable ne signifie pas que tous ses messages survivront au red\u00e9marrage du n\u0153ud. Seuls les messages d\u00e9finis par le publiant comme <i>durables<\/i> (persistent) seront restaur\u00e9s. Les messages durables cr\u00e9ent effectivement une charge suppl\u00e9mentaire pour le courtier, mais si la perte d'un message est inacceptable, il n'y a pas d'autre option.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/8b8e2de4ef82bf8497960657aac0ddb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 1. Matrice de durabilit\u00e9<\/i><\/p>\n<h1>Clustering avec r\u00e9plication de files d'attente<\/h1>\n<p>\nPour survivre \u00e0 la perte d'un courtier, nous avons besoin de redondance. Nous pouvons regrouper plusieurs n\u0153uds RabbitMQ en un cluster, puis ajouter une redondance suppl\u00e9mentaire en r\u00e9pliquant les files d'attente entre plusieurs n\u0153uds. Ainsi, si un n\u0153ud tombe, nous ne perdons pas de donn\u00e9es et restons accessibles. <\/p>\n<p>R\u00e9plication de file d'attente:<\/p>\n<ul>\n<li>une file d'attente principale (master), qui re\u00e7oit toutes les commandes d'\u00e9criture et de lecture\n<\/li>\n<li>une ou plusieurs r\u00e9pliques, qui re\u00e7oivent tous les messages et m\u00e9tadonn\u00e9es de la file principale. Ces r\u00e9pliques n'existent pas pour l'\u00e9volutivit\u00e9, mais uniquement pour la redondance.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/35f3d4bdc4f5e10da0e40eb91c5d8280.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 2. R\u00e9plication de file d'attente<\/i><\/p>\n<p>La r\u00e9plication est configur\u00e9e par la politique appropri\u00e9e. Vous pouvez y choisir le coefficient de r\u00e9plication et m\u00eame les n\u0153uds sur lesquels la file d'attente doit \u00eatre plac\u00e9e. Exemples :<\/p>\n<ul>\n<li><code>ha-mode: all<\/code>\n<\/li>\n<li><code>ha-mode: exactly, ha-params: 2<\/code> (un ma\u00eetre et une r\u00e9plique)\n<\/li>\n<li><code>ha-mode: nodes, ha-params: rabbit@node1, rabbit@node2<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h1>Confirmation au publiant<\/h1>\n<p>\nPour assurer un enregistrement coh\u00e9rent, des confirmations sont n\u00e9cessaires de la part du publieur (Publisher Confirms). Sans elles, il y a un risque de perte de messages. La confirmation est envoy\u00e9e au publieur apr\u00e8s que le message a \u00e9t\u00e9 \u00e9crit sur le disque. RabbitMQ \u00e9crit les messages sur le disque non pas \u00e0 la r\u00e9ception, mais de mani\u00e8re p\u00e9riodique, dans une plage de plusieurs centaines de millisecondes. Lorsque la file est mise en miroir, la confirmation n'est envoy\u00e9e qu'apr\u00e8s que tous les miroirs aient \u00e9galement \u00e9crit leur copie du message sur le disque. Cela signifie que l'utilisation de confirmations ajoute un retard, mais si la s\u00e9curit\u00e9 des donn\u00e9es est importante, elles sont n\u00e9cessaires.<\/p>\n<h1>File d'attente tol\u00e9rante aux pannes<\/h1>\n<p>\nLorsque le courtier s'arr\u00eate ou tombe en panne, toutes les files ma\u00eetresses sur ce n\u0153ud tombent avec lui. Ensuite, le cluster choisit le miroir le plus ancien de chaque ma\u00eetre et le promeut en tant que nouveau ma\u00eetre.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/8d8227c00643f35e0dc752b6617e18fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 3. Plusieurs files d'attente mises en miroir et leurs politiques<\/i><\/p>\n<p>Le courtier 3 tombe. Notez que le miroir de la File d'attente C sur le Courtier 2 est promu au rang de ma\u00eetre. Remarquez \u00e9galement qu'un nouveau miroir pour la File d'attente C est cr\u00e9\u00e9 sur le Courtier 1. RabbitMQ essaie toujours de maintenir le ratio de r\u00e9plication d\u00e9fini dans vos politiques.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/d08b3ada22e79686d448714f7bab009a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 4. Le courtier 3 tombe, ce qui provoque une d\u00e9faillance de la File d'attente C<\/i> <\/p>\n<p>Le prochain Courtier 1 tombe ! Il ne nous reste qu'un seul courtier. Le miroir de la File d'attente B est promu au rang de ma\u00eetre.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/dcc1d542c40c441194fd07e51046c619.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 5<\/i><\/p>\n<p>Nous avons r\u00e9cup\u00e9r\u00e9 le Courtier 1. Peu importe combien de donn\u00e9es ont surv\u00e9cu \u00e0 la perte et \u00e0 la r\u00e9cup\u00e9ration du courtier, tous les messages mis en miroir de la file d'attente sont rejet\u00e9s lors du red\u00e9marrage. Il est important de noter cela car il y aura des cons\u00e9quences. Nous examinerons bient\u00f4t ces cons\u00e9quences. Ainsi, le Courtier 1 est \u00e0 nouveau membre du cluster et le cluster essaie de respecter les politiques et cr\u00e9e donc des miroirs sur le Courtier 1.<\/p>\n<p>Dans ce cas, la perte du Courtier 1 \u00e9tait totale, tout comme la perte de donn\u00e9es, donc la File d'attente B, non mise en miroir, est compl\u00e8tement perdue.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/7ac7ab65ea6dff9c5a49372c04c83a37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 6. Le Courtier 1 revient en ligne<\/i><\/p>\n<p>Le Broker 3 est de retour en service, ce qui permet aux files A et B de reprendre les miroirs qui y ont \u00e9t\u00e9 cr\u00e9\u00e9s pour satisfaire \u00e0 leurs politiques HA. Mais maintenant, toutes les files principales se trouvent sur un seul n\u0153ud ! Ce n'est pas id\u00e9al, un meilleur \u00e9quilibrage entre les n\u0153uds serait pr\u00e9f\u00e9rable. Malheureusement, il n'y a pas beaucoup d'options pour rebalancer les ma\u00eetres. Nous reviendrons sur ce probl\u00e8me plus tard, car il faut d'abord examiner la synchronisation des files. <\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/a54e53bb01e2f830a54f88acaa668984.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 7. Le Broker 3 reprend du service. Toutes les files principales sur un seul n\u0153ud !<\/i><\/p>\n<p>Ainsi, vous devriez d\u00e9sormais avoir une id\u00e9e de la mani\u00e8re dont les miroirs assurent la redondance et la tol\u00e9rance aux pannes. Cela garantit la disponibilit\u00e9 en cas de d\u00e9faillance d'un n\u0153ud et prot\u00e8ge contre la perte de donn\u00e9es. Mais nous n'en avons pas encore termin\u00e9, car en r\u00e9alit\u00e9, tout cela est bien plus complexe.<\/p>\n<h1>Synchronisation<\/h1>\n<p>\nLors de la cr\u00e9ation d'un nouveau miroir, tous les nouveaux messages seront toujours r\u00e9pliqu\u00e9s vers ce miroir et tous les autres. En ce qui concerne les donn\u00e9es existantes dans la file principale, nous pouvons les r\u00e9pliquer dans le nouveau miroir, qui devient une copie compl\u00e8te du ma\u00eetre. Nous pouvons \u00e9galement choisir de ne pas r\u00e9pliquer les messages existants et laisser la file principale et le nouveau miroir se synchroniser dans le temps, avec les nouveaux messages entrant \u00e0 la fin, tandis que les messages existants sortent du d\u00e9but de la file principale.<\/p>\n<p>Cette synchronisation peut \u00eatre effectu\u00e9e automatiquement ou manuellement et est g\u00e9r\u00e9e via des politiques de files. Prenons un exemple.<\/p>\n<p>Nous avons deux files en miroir. La file A se synchronise automatiquement, tandis que la file B se synchronise manuellement. Les deux files contiennent dix messages.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/304f2a475fdd0cb6d3069140c667a0a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 8. Deux files avec diff\u00e9rents modes de synchronisation<\/i><\/p>\n<p>Nous perdons maintenant le Broker 3.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/49114966f440c407488bb467ff6dbf93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 9. Le Broker 3 est tomb\u00e9<\/i><\/p>\n<p>Le Broker 3 reprend du service. Le cluster cr\u00e9e un miroir pour chaque file sur un nouveau n\u0153ud et synchronise automatiquement la nouvelle file A avec le ma\u00eetre. Cependant, le miroir de la nouvelle file B reste vide. Ainsi, nous avons une redondance compl\u00e8te pour la file A et seulement un miroir pour les messages existants de la file B.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/adffc1f5eff8806edbd83772f338d67f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 10. Le nouveau miroir de la file A re\u00e7oit tous les messages existants, tandis que le nouveau miroir de la file B ne re\u00e7oit rien.<\/i><\/p>\n<p>Dans les deux files, dix nouveaux messages sont ajout\u00e9s. Ensuite, le Courtier 2 tombe, et la File A revient \u00e0 la plus ancienne r\u00e9plique, qui se trouve sur le Courtier 1. Aucun perte de donn\u00e9es ne se produit lors de la panne. Dans la File B, il y a vingt messages dans le ma\u00eetre et seulement dix dans la r\u00e9plique, car cette file n'a jamais r\u00e9pliqu\u00e9 les dix messages originaux.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/c6cfef4bced5627bf243c2f020a42646.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 11. La File A revient sur le Courtier 1 sans perte de messages<\/i><\/p>\n<p>Dans les deux files, dix nouveaux messages sont ajout\u00e9s. Maintenant, le Courtier 1 tombe. La File A bascule sans probl\u00e8me vers la r\u00e9plique sans perte de messages. Cependant, la File B rencontre des probl\u00e8mes. \u00c0 ce stade, nous pouvons optimiser soit la disponibilit\u00e9, soit la coh\u00e9rence. <\/p>\n<p>Si nous voulons optimiser la disponibilit\u00e9, alors la politique <b><i>ha-promote-on-failure<\/i><\/b> doit \u00eatre d\u00e9finie sur <b><i>always<\/i><\/b>. C'est la valeur par d\u00e9faut, donc nous pouvons simplement ne pas sp\u00e9cifier de politique. Dans ce cas, nous acceptons en effet des pannes dans des r\u00e9pliques non synchronis\u00e9es. Cela entra\u00eenera la perte de messages, mais la file reste accessible en lecture et \u00e9criture.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/cd704cf4397184c212e1576b986abbaa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 12. La File A revient sur le Courtier 3 sans perte de messages. La File B revient sur le Courtier 3 avec une perte de dix messages<\/i><\/p>\n<p>Nous pouvons \u00e9galement d\u00e9finir <code>ha-promote-on-failure<\/code> \u00e0 la valeur <code>when-synced<\/code>. Dans ce cas, au lieu de revenir \u00e0 la r\u00e9plique, la file attendra que le Courtier 1 avec ses donn\u00e9es revienne en ligne. Apr\u00e8s son retour, la file principale est \u00e0 nouveau sur le Courtier 1 sans perte de donn\u00e9es. La disponibilit\u00e9 est sacrifi\u00e9e au profit de la s\u00e9curit\u00e9 des donn\u00e9es. Mais c'est un mode risqu\u00e9 qui peut m\u00eame entra\u00eener une perte compl\u00e8te de donn\u00e9es, ce que nous examinerons prochainement.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/03fed936fe75220e22f68432ca81b654.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 13. La File B reste inaccessible apr\u00e8s la perte du Courtier 1<\/i><\/p>\n<p>Vous pourriez vous demander : \u00ab Peut-\u00eatre vaut-il mieux ne jamais utiliser la synchronisation automatique ? \u00bb. La r\u00e9ponse est que la synchronisation est une op\u00e9ration bloquante. Pendant la synchronisation, la file principale ne peut effectuer aucune op\u00e9ration de lecture ou d'\u00e9criture !<\/p>\n<p>Consid\u00e9rons un exemple. Nous avons maintenant des files tr\u00e8s grandes. Comment peuvent-elles atteindre une telle taille ? Pour plusieurs raisons :<\/p>\n<ul>\n<li>Les files ne sont pas utilis\u00e9es activement\n<\/li>\n<li>Ce sont des files \u00e0 haute vitesse, et en ce moment, les consommateurs fonctionnent lentement \n<\/li>\n<li>Ce sont des files \u00e0 haute vitesse, il y a eu une panne, et les consommateurs rattrapent leur retard<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/dd4b0fd70cbbc0b7defc06536157770d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 14. Deux grandes files d'attente avec diff\u00e9rents modes de synchronisation<\/i><\/p>\n<p>Maintenant, le Broker 3 tombe.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/8c31cfdf485ab4c9dfe13e86a151df4f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 15. Le Broker 3 tombe, laissant un ma\u00eetre et un miroir dans chaque file d'attente<\/i><\/p>\n<p>Le Broker 3 revient en ligne, et de nouveaux miroirs sont cr\u00e9\u00e9s. La File d'attente Principale A commence \u00e0 r\u00e9pliquer les messages existants sur le nouveau miroir, ce qui rend la file d'attente indisponible pendant cette p\u00e9riode. La r\u00e9plication des donn\u00e9es prend deux heures, entra\u00eenant deux heures de temps d'arr\u00eat pour cette file d'attente !<\/p>\n<p>Cependant, la File d'attente B reste disponible pendant toute cette p\u00e9riode. Elle a sacrifi\u00e9 une partie de sa redondance pour la disponibilit\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/28e641300a1c3f4d70e29a16db51521e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 16. La file d'attente reste indisponible pendant la synchronisation<\/i><\/p>\n<p>Apr\u00e8s deux heures, la File d'attente A devient \u00e9galement disponible et peut \u00e0 nouveau commencer \u00e0 accepter des op\u00e9rations de lecture et d'\u00e9criture.<\/p>\n<h3>Mises \u00e0 jour<\/h3>\n<p>\nCe comportement bloquant pendant la synchronisation complique la mise \u00e0 jour des clusters avec des files d'attente tr\u00e8s grandes. \u00c0 un moment donn\u00e9, le n\u0153ud avec le ma\u00eetre doit \u00eatre red\u00e9marr\u00e9, ce qui signifie soit passer au miroir, soit d\u00e9sactiver la file d'attente pendant la mise \u00e0 jour du serveur. Si nous choisissons de passer, nous perdrons des messages si les miroirs ne sont pas synchronis\u00e9s. Par d\u00e9faut, lors de la d\u00e9sactivation du broker, le passage \u00e0 un miroir non synchronis\u00e9 ne se produit pas. Cela signifie qu'une fois le broker de retour, nous ne perdons aucun message, le seul dommage \u00e9tant le temps d'arr\u00eat de la file d'attente. Les r\u00e8gles de comportement lors de la d\u00e9sactivation du broker sont d\u00e9finies par la politique <code>ha-promote-on-shutdown<\/code>. Vous pouvez d\u00e9finir l'une des deux valeurs :<\/p>\n<ul>\n<li><code>always<\/code>= activation du passage aux miroirs non synchronis\u00e9s\n<\/li>\n<li><code>when-synced<\/code>= passage uniquement au miroir synchronis\u00e9, sinon la file d'attente devient indisponible pour la lecture et l'\u00e9criture. La file d'attente revient en ligne d\u00e8s que le broker revient<\/li>\n<\/ul>\n<p>\nQuoi qu'il en soit, avec de grandes files d'attente, il faut choisir entre perdre des donn\u00e9es et \u00eatre indisponible.<\/p>\n<h3>Lorsque la disponibilit\u00e9 accro\u00eet la s\u00e9curit\u00e9 des donn\u00e9es<\/h3>\n<p>\nAvant de prendre une d\u00e9cision, il faut prendre en compte une autre complication. Bien que la synchronisation automatique soit meilleure pour la redondance, comment cela affecte-t-il la s\u00e9curit\u00e9 des donn\u00e9es ? Certes, gr\u00e2ce \u00e0 une meilleure redondance, RabbitMQ est moins susceptible de perdre des messages existants, mais qu'en est-il des nouveaux messages des \u00e9diteurs ?<\/p>\n<p>Voici ce qu'il faut prendre en compte :<\/p>\n<ul>\n<li>Un \u00e9diteur peut-il simplement renvoyer une erreur, et le service sup\u00e9rieur ou l'utilisateur essaiera-t-il \u00e0 nouveau plus tard ?\n<\/li>\n<li>Un \u00e9diteur peut-il conserver le message localement ou dans une base de donn\u00e9es pour r\u00e9essayer plus tard ?<\/li>\n<\/ul>\n<p>\nSi l'\u00e9diteur ne peut que rejeter le message, alors en r\u00e9alit\u00e9, am\u00e9liorer la disponibilit\u00e9 augmente \u00e9galement la s\u00e9curit\u00e9 des donn\u00e9es.<\/p>\n<p>Ainsi, il faut chercher un \u00e9quilibre, et la solution d\u00e9pend de la situation sp\u00e9cifique.<\/p>\n<h1>Probl\u00e8mes avec ha-promote-on-failure=when-synced<\/h1>\n<p>\nId\u00e9e <i><b>ha-promote-on-failure<\/b><\/i>= <i><b>when-synced<\/b><\/i> r\u00e9side dans le fait que nous pr\u00e9venons le passage \u00e0 un miroir non synchronis\u00e9, \u00e9vitant ainsi la perte de donn\u00e9es. La file d'attente reste inaccessible en lecture ou \u00e9criture. Au lieu de cela, nous tentons de r\u00e9tablir le courtier \u00e9chou\u00e9 avec des donn\u00e9es intactes pour qu'il reprenne son r\u00f4le de ma\u00eetre sans perte de donn\u00e9es. <\/p>\n<p>Mais (et c'est un gros mais) si le courtier a perdu ses donn\u00e9es, nous avons un grand probl\u00e8me : la file est perdue ! Toutes les donn\u00e9es ont disparu ! M\u00eame si vous avez des miroirs qui sont principalement en train de rattraper la file principale, ces miroirs sont \u00e9galement rejet\u00e9s.<\/p>\n<p>Pour ajouter \u00e0 nouveau un n\u0153ud avec le m\u00eame nom, nous demandons au cluster d'oublier le n\u0153ud perdu (avec la commande <i>rabbitmqctl forget_cluster_node<\/i>) et de lancer un nouveau courtier avec le m\u00eame nom d'h\u00f4te. Tant que le cluster se souvient du n\u0153ud perdu, il se souvient de l'ancienne file et des miroirs non synchronis\u00e9s. Lorsque l'on demande au cluster d'oublier le n\u0153ud perdu, cette file est \u00e9galement oubli\u00e9e. Il faut maintenant la red\u00e9clarer. Nous avons perdu toutes les donn\u00e9es, m\u00eame si nous avions des miroirs avec un ensemble de donn\u00e9es partiel. Il aurait \u00e9t\u00e9 pr\u00e9f\u00e9rable de passer \u00e0 un miroir non synchronis\u00e9 !<\/p>\n<p>C'est pourquoi la synchronisation manuelle (et le non-synchronisation) associ\u00e9e \u00e0 <code>ha-promote-on-failure=when-synced<\/code>, \u00e0 mon avis, pr\u00e9sente un risque consid\u00e9rable. Les documents indiquent qu'une telle option existe pour la s\u00e9curit\u00e9 des donn\u00e9es, mais c'est une arme \u00e0 double tranchant.<\/p>\n<h1>Rebalancement des ma\u00eetres<\/h1>\n<p>\nComme promis, nous revenons au probl\u00e8me de l'accumulation de tous les ma\u00eetres sur un ou plusieurs n\u0153uds. Cela peut se produire m\u00eame \u00e0 la suite d'une mise \u00e0 jour \u00ab roulante \u00bb du cluster. Dans un cluster de trois n\u0153uds, toutes les files principales s'accumuleront sur un ou deux n\u0153uds.<\/p>\n<p>Le rebalancement des ma\u00eetres peut poser probl\u00e8me pour deux raisons :<\/p>\n<ul>\n<li>Il n'existe pas de bons outils pour effectuer le rebalancement<\/li>\n<li>Synchronisation des files d'attente<\/li>\n<\/ul>\n<p>\nPour le r\u00e9\u00e9quilibrage, il existe un outil tiers <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Ayanda-D\/rabbitmq-queue-master-balancer\">plugin<\/a><\/noindex>, qui n'est pas officiellement pris en charge. En ce qui concerne les plugins tiers, le guide RabbitMQ <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/upgrade.html\">indique<\/a><\/noindex>: \u00ab Le plugin fournit certains outils suppl\u00e9mentaires de configuration et de reporting, mais il n'est pas pris en charge ni v\u00e9rifi\u00e9 par l'\u00e9quipe RabbitMQ. Utilisez-le \u00e0 vos risques et p\u00e9rils. \u00bb<\/p>\n<p>Il existe \u00e9galement une autre astuce pour d\u00e9placer la file d'attente principale via des politiques HA. Le guide mentionne <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/support-tools\/blob\/master\/scripts\/rebalance-queue-masters\">script<\/a><\/noindex> cela. Cela fonctionne comme suit :<\/p>\n<ul>\n<li>Supprime tous les miroirs \u00e0 l'aide d'une politique temporaire avec une priorit\u00e9 plus \u00e9lev\u00e9e que la politique HA existante.\n<\/li>\n<li>Modifie la politique temporaire HA pour utiliser le mode \u00ab n\u0153uds \u00bb en sp\u00e9cifiant le n\u0153ud vers lequel la file d'attente principale doit \u00eatre d\u00e9plac\u00e9e.\n<\/li>\n<li>Synchronise la file d'attente pour forcer la migration.\n<\/li>\n<li>Une fois la migration termin\u00e9e, la politique temporaire est supprim\u00e9e. La politique HA d'origine entre en vigueur et le nombre n\u00e9cessaire de miroirs est cr\u00e9\u00e9.<\/li>\n<\/ul>\n<p>\nL'inconv\u00e9nient est que cette approche peut ne pas fonctionner si vous avez de grandes files d'attente ou des exigences strictes en mati\u00e8re de redondance.<\/p>\n<p>Regardons maintenant comment les clusters RabbitMQ fonctionnent avec les partitions r\u00e9seau.<\/p>\n<h1>Violation de la coh\u00e9rence<\/h1>\n<p>\nLes n\u0153uds d'un syst\u00e8me distribu\u00e9 sont connect\u00e9s par des liaisons r\u00e9seau, et ces liaisons peuvent \u00eatre et seront coup\u00e9es. La fr\u00e9quence des coupures d\u00e9pend de l'infrastructure locale ou de la fiabilit\u00e9 du cloud choisi. Dans tous les cas, les syst\u00e8mes distribu\u00e9s doivent \u00eatre capables de g\u00e9rer ces situations. Encore une fois, nous sommes confront\u00e9s \u00e0 un choix entre disponibilit\u00e9 et coh\u00e9rence, et encore une fois, la bonne nouvelle est que RabbitMQ offre les deux options (mais pas en m\u00eame temps).<\/p>\n<p>Avec RabbitMQ, nous avons deux options principales :<\/p>\n<ul>\n<li>Autoriser la division logique (split-brain). Cela garantit la disponibilit\u00e9, mais peut entra\u00eener une perte de donn\u00e9es.\n<\/li>\n<li>Interdire la division logique. Cela peut conduire \u00e0 une perte temporaire de disponibilit\u00e9 selon la fa\u00e7on dont les clients se connectent au cluster. Cela peut \u00e9galement conduire \u00e0 une indisponibilit\u00e9 totale du cluster compos\u00e9 de deux n\u0153uds.<\/li>\n<\/ul>\n<p>\nMais qu'est-ce que la division logique ? C'est lorsque le cluster est divis\u00e9 en deux en raison d'une perte de liaison r\u00e9seau. De chaque c\u00f4t\u00e9, les miroirs passent en mode ma\u00eetre, de sorte qu'au final, chaque file d'attente a plusieurs ma\u00eetres.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/d880a935df450fb994edfed0715e026e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 17. La file principale et deux miroirs, chacun sur un n\u0153ud distinct. Ensuite, une d\u00e9faillance r\u00e9seau se produit, et un des miroirs se d\u00e9connecte. Le n\u0153ud s\u00e9par\u00e9 constate que les deux autres sont hors ligne et promeut ses miroirs au statut de ma\u00eetre. Nous avons maintenant deux files principales, toutes deux autorisant l'\u00e9criture et la lecture.<\/i> <\/p>\n<p>Si les \u00e9diteurs envoient des donn\u00e9es vers les deux ma\u00eetres, nous obtiendrons deux copies divergentes de la file.<\/p>\n<p>Diff\u00e9rents modes RabbitMQ offrent soit la disponibilit\u00e9, soit la coh\u00e9rence.<\/p>\n<h3>Mode Ignore (par d\u00e9faut)<\/h3>\n<p>\nCe mode assure la disponibilit\u00e9. Apr\u00e8s une perte de connectivit\u00e9, une s\u00e9paration logique se produit. Apr\u00e8s la restauration de la connectivit\u00e9, l'administrateur doit d\u00e9cider quel segment privil\u00e9gier. Le c\u00f4t\u00e9 perdant sera red\u00e9marr\u00e9, et toutes les donn\u00e9es accumul\u00e9es de ce c\u00f4t\u00e9 seront perdues.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/4d82c13b5ef21837ba819f5c246a1e41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 18. Trois \u00e9diteurs sont connect\u00e9s \u00e0 trois courtiers. En interne, le cluster dirige toutes les requ\u00eates vers la file principale sur le Courtier 2.<\/i><\/p>\n<p>Nous perdons maintenant le Courtier 3. Il constate que d'autres courtiers sont hors ligne et promeut son miroir au statut de ma\u00eetre. Cela entra\u00eene une s\u00e9paration logique.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/c7e01d51b24023bacdd93cfad95c9eab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 19. S\u00e9paration logique (split-brain). Les \u00e9critures sont dirig\u00e9es vers deux files principales, et deux copies divergent.<\/i><\/p>\n<p>La connectivit\u00e9 est r\u00e9tablie, mais la s\u00e9paration logique reste. L'administrateur doit manuellement choisir le c\u00f4t\u00e9 perdant. Dans le cas ci-dessous, l'administrateur red\u00e9marre le Courtier 3. Tous les messages qui n'ont pas \u00e9t\u00e9 transmis sont perdus.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/51c3ee15024d3c83ba625e3ff9cdeb90.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 20. L'administrateur d\u00e9connecte le Courtier 3.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/0bac8e33de25c0c5381d336d26464858.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 21. L'administrateur red\u00e9marre le Courtier 3, et il se reconnecte au cluster, perdant tous les messages qui y sont rest\u00e9s.<\/i><\/p>\n<p>Pendant la perte de connectivit\u00e9 et apr\u00e8s sa restauration, le cluster et cette file \u00e9taient disponibles pour la lecture et l'\u00e9criture.<\/p>\n<h3>Mode Autoheal<\/h3>\n<p>\nFonctionne de mani\u00e8re similaire au mode Ignore, sauf que le cluster choisit automatiquement le c\u00f4t\u00e9 perdant apr\u00e8s la s\u00e9paration et la restauration de la connectivit\u00e9. Le c\u00f4t\u00e9 perdant revient dans le cluster vide, et la file perd tous les messages qui n'ont \u00e9t\u00e9 envoy\u00e9s qu'\u00e0 ce c\u00f4t\u00e9.<\/p>\n<h3>Mode Pause Minority<\/h3>\n<p>\nSi nous ne voulons pas permettre une s\u00e9paration logique, notre seule option est de renoncer \u00e0 la lecture et \u00e0 l'\u00e9criture sur le c\u00f4t\u00e9 minoritaire apr\u00e8s la partition du cluster. Lorsque le courtier constate qu'il se trouve sur le c\u00f4t\u00e9 minoritaire, il suspend son activit\u00e9, c'est-\u00e0-dire qu'il ferme toutes les connexions existantes et refuse toutes les nouvelles. Une fois par seconde, il v\u00e9rifie la restauration de la connectivit\u00e9. D\u00e8s que la connectivit\u00e9 est r\u00e9tablie, il reprend son activit\u00e9 et rejoint le cluster.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/7a51cf509b2c94e2ae100c7dedd9d21a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 22. Trois \u00e9diteurs sont li\u00e9s \u00e0 trois courtiers. En interne, le cluster dirige toutes les demandes vers la file d'attente principale du Courtier 2.<\/i><\/p>\n<p>Ensuite, les Courtiers 1 et 2 se s\u00e9parent du Courtier 3. Au lieu d'\u00e9lever son miroir en ma\u00eetre, le Courtier 3 suspend son activit\u00e9 et devient indisponible.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/c12ec38a47e1f8ccceebfa1854f54f21.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 23. Le Courtier 3 suspend son activit\u00e9, d\u00e9connecte tous les clients et rejette les demandes de connexion.<\/i><\/p>\n<p>D\u00e8s que la connectivit\u00e9 est r\u00e9tablie, il revient dans le cluster.<\/p>\n<p>Examinons un autre exemple o\u00f9 la file d'attente principale se trouve sur le Courtier 3.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/4cc6a28270f00a280ecb5af5252f4e07.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 24. La file d'attente principale sur le Courtier 3.<\/i><\/p>\n<p>Ensuite, la m\u00eame perte de connectivit\u00e9 se produit. Le Courtier 3 se met en pause, car il se trouve sur le c\u00f4t\u00e9 minoritaire. De l'autre c\u00f4t\u00e9, les n\u0153uds voient que le Courtier 3 s'est d\u00e9connect\u00e9, donc un miroir plus ancien des Courtiers 1 et 2 est \u00e9lev\u00e9 en ma\u00eetre.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/d0d032385533bb53c5a95927afcd3119.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 25. Passage au Courtier 2 en cas d'indisponibilit\u00e9 du Courtier 3.<\/i><\/p>\n<p>Lorsque la connectivit\u00e9 est r\u00e9tablie, le Courtier 3 rejoindra le cluster.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans les clusters\" src=\"\/wp-content\/uploads\/2019\/11\/53f8186a040ae07724ef59cf79b72a0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 26. Le cluster est revenu \u00e0 un fonctionnement normal.<\/i><\/p>\n<p>Il est important de comprendre ici que nous obtenons la coh\u00e9rence, mais nous pouvons \u00e9galement obtenir la disponibilit\u00e9, <i><b>si<\/b><\/i> nous transf\u00e9rons avec succ\u00e8s les clients vers la plus grande partie de la partition. Pour la plupart des situations, personnellement, je choisirais le mode Pause Minority, mais cela d\u00e9pend r\u00e9ellement du cas sp\u00e9cifique.<\/p>\n<p>Pour assurer la disponibilit\u00e9, il est important de garantir que les clients se connectent avec succ\u00e8s au n\u0153ud. Examinons nos options.<\/p>\n<h1>Assurer la connectivit\u00e9 des clients<\/h1>\n<p>\nNous avons plusieurs options pour rediriger les clients vers la partie principale du cluster ou vers des n\u0153uds op\u00e9rationnels apr\u00e8s une perte de connectivit\u00e9 (apr\u00e8s la d\u00e9faillance d'un n\u0153ud). Commen\u00e7ons par rappeler qu'une file d'attente sp\u00e9cifique est h\u00e9berg\u00e9e sur un n\u0153ud donn\u00e9, mais le routage et les politiques sont r\u00e9pliqu\u00e9s sur tous les n\u0153uds. Les clients peuvent se connecter \u00e0 n'importe quel n\u0153ud, et le routage interne les dirigera l\u00e0 o\u00f9 ils doivent aller. Mais lorsque le n\u0153ud est suspendu, il rejette les connexions, donc les clients doivent se connecter \u00e0 un autre n\u0153ud. Si un n\u0153ud est d\u00e9faillant, il ne peut absolument rien faire.<\/p>\n<p>Nos options :<\/p>\n<ul>\n<li>L'acc\u00e8s au cluster se fait via un r\u00e9partiteur de charge qui parcourt simplement les n\u0153uds de mani\u00e8re circulaire, tandis que les clients r\u00e9essaient de se connecter jusqu'\u00e0 ce que cela r\u00e9ussisse. Si un n\u0153ud ne fonctionne pas ou est suspendu, les tentatives de connexion \u00e9choueront, mais les suivantes iront vers d'autres serveurs (en mode circulaire). Cela convient pour une perte de connectivit\u00e9 \u00e0 court terme ou pour un serveur en panne qui sera rapidement r\u00e9tabli.\n<\/li>\n<li>Acc\u00e9der au cluster via un r\u00e9partiteur de charge et retirer les n\u0153uds suspendus ou d\u00e9faillants de la liste d\u00e8s qu'ils sont d\u00e9tect\u00e9s. Si cela est fait rapidement, et si les clients peuvent r\u00e9essayer de se connecter, nous obtiendrons une disponibilit\u00e9 constante.\n<\/li>\n<li>Donner \u00e0 chaque client une liste de tous les n\u0153uds, et le client choisit al\u00e9atoirement l'un d'eux lors de la connexion. S'il re\u00e7oit une erreur lors de la tentative de connexion, il passe au n\u0153ud suivant dans la liste, jusqu'\u00e0 ce qu'il se connecte.\n<\/li>\n<li>\u00c9liminer le trafic du n\u0153ud d\u00e9faillant ou suspendu \u00e0 l'aide de DNS. Cela se fait gr\u00e2ce \u00e0 un faible TTL.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Conclusions<\/h1>\n<p>\nLa clustering de RabbitMQ a ses propres avantages et inconv\u00e9nients. Les inconv\u00e9nients les plus s\u00e9rieux sont que :<\/p>\n<ul>\n<li>lorsqu'ils rejoignent le cluster, les n\u0153uds rejettent leurs donn\u00e9es ;\n<\/li>\n<li>la synchronisation bloquante entra\u00eene une indisponibilit\u00e9 de la file d'attente.<\/li>\n<\/ul>\n<p>\nToutes les d\u00e9cisions difficiles d\u00e9coulent de ces deux caract\u00e9ristiques de l'architecture. Si RabbitMQ pouvait conserver des donn\u00e9es lors de la reconnexion d'un cluster, la synchronisation serait plus rapide. S'il \u00e9tait capable de synchronisation non bloquante, il supporterait mieux les grandes files d'attente. La r\u00e9solution de ces deux probl\u00e8mes am\u00e9liorerait consid\u00e9rablement les performances de RabbitMQ en tant que technologie de messagerie r\u00e9siliente et hautement disponible. Je ne recommanderais pas RabbitMQ avec clustering dans les situations suivantes :<\/p>\n<ul>\n<li>R\u00e9seau peu fiable.\n<\/li>\n<li>Stockage peu fiable.\n<\/li>\n<li>Tr\u00e8s grandes files d'attente.<\/li>\n<\/ul>\n<p>\nConcernant les r\u00e9glages pour une haute disponibilit\u00e9, envisagez les suivants :<\/p>\n<ul>\n<li><code>ha-promote-on-failure=always<\/code>\n<\/li>\n<li><code>ha-sync-mode=manual<\/code>\n<\/li>\n<li><code>cluster_partition_handling=ignore<\/code> ou <code>autoheal<\/code>)\n<\/li>\n<li>messages durables\n<\/li>\n<li>veuillez vous assurer que les clients se connectent \u00e0 un n\u0153ud actif lorsque quelque chose \u00e9choue<\/li>\n<\/ul>\n<p>\nPour la coh\u00e9rence (s\u00e9curit\u00e9 des donn\u00e9es), envisagez les r\u00e9glages suivants :<\/p>\n<ul>\n<li>Publisher Confirms et Manual Acknowledgements du c\u00f4t\u00e9 du consommateur\n<\/li>\n<li><code>ha-promote-on-failure=when-synced<\/code>, si les \u00e9diteurs peuvent r\u00e9essayer plus tard et si vous avez un stockage tr\u00e8s fiable ! Sinon, d\u00e9finissez <code>=always<\/code>.\n<\/li>\n<li><code>ha-sync-mode=automatic<\/code> (mais pour les grandes files d'attente inactives, un mode manuel peut \u00eatre n\u00e9cessaire ; de plus, consid\u00e9rez si l'indisponibilit\u00e9 pourrait entra\u00eener la perte de messages)\n<\/li>\n<li>mode Pause Minority\n<\/li>\n<li>messages durables<\/li>\n<\/ul>\n<p>\nNous n'avons pas encore abord\u00e9 toutes les questions de r\u00e9silience et de haute disponibilit\u00e9 ; par exemple, comment effectuer en toute s\u00e9curit\u00e9 des proc\u00e9dures administratives (telles que les mises \u00e0 jour continues). Il faut aussi parler de la f\u00e9d\u00e9ration et du plugin Shovel.<\/p>\n<p>Si j'ai encore quelque chose \u00e0 manquer, merci de me le faire savoir.<\/p>\n<p>Voir aussi mon <noindex><a rel=\"nofollow\" href=\"https:\/\/jack-vanlightly.com\/blog\/2018\/9\/10\/how-to-lose-messages-on-a-rabbitmq-cluster\">post<\/a><\/noindex>, o\u00f9 j'explore le cluster RabbitMQ avec Docker et Blockade pour tester certains sc\u00e9narios de perte de messages d\u00e9crits dans cet article.<\/p>\n<p>Articles pr\u00e9c\u00e9dents de la s\u00e9rie : <br \/>\nn\u00b01 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/416629\/\">habr.com\/fr\/company\/itsumma\/blog\/416629<\/a><\/noindex> <br \/>\nn\u00b02 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/418389\/\">habr.com\/fr\/company\/itsumma\/blog\/418389<\/a><\/noindex> <br \/>\nn\u00b03 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/437446\/\">habr.com\/fr\/company\/itsumma\/blog\/437446<\/a><\/noindex><br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u2014 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0442\u0435\u043c\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u043c RabbitMQ \u0438 Kafka \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e RabbitMQ, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u2014 \u043e Kafka, \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 RabbitMQ. \u0421\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u0438\u043d\u043d\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 (HA), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0434\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438. RabbitMQ \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52525","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47RabbitMQ \u043f\u0440\u043e\u0442\u0438\u0432 Kafka: \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-09T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RabbitMQ contre Kafka : r\u00e9silience et haute disponibilit\u00e9 dans des clusters | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47RabbitMQ \u043f\u0440\u043e\u0442\u0438\u0432 Kafka: \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost-v-klasterah","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-09T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52525","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:41:25","updated":"2026-01-24 03:54:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=52525"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52525\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=52525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=52525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=52525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}