Lors de l'utilisation de RabbitMQ, certains scénarios métier nécessitent de garantir une consommation séquentielle. Par exemple, dans un scénario métier où trois messages sont générés pour effectuer des opérations d'ajout, de modification et de suppression de données, si l'ordre de consommation n'est pas garanti, la séquence d'exécution peut devenir suppression, modification, ajout, entraînant ainsi un désordre.

Comme illustré ci-dessous :

La question de la séquentialité des messages dans RabbitMQ doit être prise en compte selon trois aspects : l'ordre d'envoi des messages, l'ordre des messages dans la file d'attente et l'ordre de la consommation des messages.

Ordre d'envoi des messages

Pour la plupart des entreprises, l'ordre de transmission des messages à l'extrémité de l'expéditeur de messages n'est pas strictement requis. Peu importe qui envoie le message en premier. Si une entreprise exige que les messages soient envoyés dans l'ordre, cela signifie qu'un seul message peut être envoyé à la fois avec verrouillage global, et les messages ne peuvent pas être envoyés simultanément.

Ordre des messages dans la file d'attente

Dans RabbitMQ, les messages seront finalement stockés dans une file d'attente. Au sein de la même file d'attente, les messages sont ordonnés selon le principe du premier entré, premier sorti, ce qui est garanti par RabbitMQ et ne nécessite généralement pas d'être pris en compte par les développeurs.

Remarque : L'ordre des messages dans différentes files d'attente n'est pas garanti. Par exemple, lorsque vous entrez dans une station de métro et que vous rejoignez l'une des trois files d'attente, l'ordre d'entrée dans la station ne peut être garanti entre les files d'attente différentes.

Ordre de la consommation des messages

Lorsque l'on discute de la manière de garantir la séquentialité des messages, nous faisons généralement référence à l'ordre dans lequel les consommateurs consomment les messages. Dans les scénarios où plusieurs consommateurs consomment des messages à partir de la même file d'attente de messages, il n'est généralement pas possible de garantir la séquentialité des messages. Comme indiqué dans le schéma d'ouverture, bien que les messages dans la file d'attente de messages soient ordonnés, la consommation concurrente par plusieurs consommateurs, la vitesse à laquelle les messages sont récupérés, la vitesse d'exécution de la logique métier et les éventuelles exceptions d'exécution peuvent tous conduire à une séquentialité des messages incohérente.

Par exemple : les messages A, B et C entrent dans la file d'attente en séquence. Le consommateur A1 reçoit le message A, et le consommateur B1 reçoit le message B. Cependant, si le consommateur B1 s'exécute plus rapidement, il peut terminer avant le consommateur A1, ou si le consommateur A1 rencontre une erreur, les deux scénarios peuvent entraîner une séquentialité des messages incohérente.

La solution typique au problème de la consommation séquentielle est de n'avoir qu'un seul consommateur pour une file d'attente De cette façon, les messages peuvent être traités un par un dans l'ordre. L'inconvénient est que la capacité de concurrence diminue, et la consommation de messages concurrente n'est pas possible. C'est un compromis.

Remarque : Si l'entreprise exige une consommation séquentielle et une augmentation de la concurrence, une approche courante est de permettre des files d'attente multiples. L'entreprise peut distribuer les messages à différentes files d'attente en fonction de règles, augmentant ainsi le niveau de concurrence. Par exemple, dans un scénario de commande e-commerce, il est seulement nécessaire de garantir la séquentialité des messages de commande pour le même utilisateur. Les messages appartenant à différents utilisateurs peuvent être dirigés vers des files d'attente différentes.