Tout d’abord, nous avons 100 messages non traités sur notre serveur rabbitmq, nous ouvrons un client grand public au hasard, et la situation suivante apparaîtra,
100 données sont toutes transférées en un instant, mais nous ne pouvons pas traiter autant de données en même temps avec un seul client, que devrions-nous faire ?
Comme montré sur l’image ci-dessus, nous n’avons pas confirmé la réception du message ! Si le producteur continue à l’envoyer, nous, consommateurs, continuerons à le recevoir !
Imaginez simplement que nous, un seul consommateur, pouvons traiter jusqu’à 60 messages en 1 minute, cependant, un producteur peut envoyer 300 messages en 1 minute, si,Nous avons un client grand public qui doit recevoir 300 messages en même temps en 1 minute, ce qui a dépassé notre charge maximale, ce qui peut entraîner l’épuisement des ressources serveur et le client grand public bloqué。
RabbitMQ propose une fonctionnalité qoS (Qualité de Service), c’est-à-dire, sous prétexte d’une confirmation non automatique des messages, si un certain nombre de messages (en fixant la valeur de QoS basée sur consomme ou channel) n’est pas confirmé, de nouveaux messages ne seront pas consommés.
prefetchSize :0 prefetchCount : Dit à RabbitMQ de ne pas envoyer plus de N messages à un consommateur en même temps, c’est-à-dire qu’une fois que N messages n’ont pas encore été ackés, le consommateur bloquera jusqu’à ce qu’il y ait un message ack global :true\false Que les paramètres ci-dessus s’appliquent aux canaux, pour faire simple, que les restrictions ci-dessus soient au niveau du canal ou au niveau consommateur
Note : Il est dit que prefetchSize et global ne sont pas implémentés par rabbitmq, donc je ne les étudierai pas pour le moment
prefetch_count prend effet lorsque no_ask = faux,C’est-à-dire que, dans le cas de la réponse automatique, ces deux valeurs sontPas en vigueurde
Définir prefetchCount = 3 via la méthode BasicQos. Cela permet à RabbitMQ de traiter jusqu’à 3 messages par consommateur simultanément. En d’autres termes, il ne distribuera pas de nouveaux messages au consommateur tant qu’il ne reçoit pas l’ack. Voici comment le configurer :
Comme vous pouvez le voir sur la figure, il y a deux consommateurs qui écoutent Queue en même temps, mais notez que le message ici ne sera automatiquement accepté que s’il est consommé par un consommateur, et que l’autre consommateur ne recevra pas ce message à nouveau.
Introduction du site officiel : http://www.rabbitmq.com/consumer-prefetch.html
Notez que cette méthode peut rendre la file d’attente pleine. Bien sûr, vous devrez peut-être ajouter plus de Consommateurs ou créer plus de Virtual Hosts pour affiner votre design.
|