Først og fremmest har vi 100 ubehandlede beskeder på vores rabbitmq-server, vi åbner en forbrugerklient tilfældigt, og følgende situation opstår:
100 datastykker, alle sendt over på et øjeblik, men vi kan ikke behandle så meget data på én gang med én klient, hvad skal vi gøre?
Som vist på billedet ovenfor, bekræftede vi ikke modtagelsen af beskeden! Hvis producenten fortsætter med at sende det, vil vi forbrugere blive ved med at modtage det!
Forestil dig bare, at vi som enkelt forbruger kan behandle op til 60 beskeder på 1 minut, men en producent kan sende 300 beskeder på 1 minut, hvis,Vi har en forbrugerklient, der skal modtage 300 beskeder på én gang på 1 minut, hvilket har overskredet vores maksimale belastning, hvilket kan føre til, at serverressourcerne bliver udtømte, og forbrugerklienten sidder fast。
RabbitMQ tilbyder en qoS (Quality of Service) funktion, det vil sige, under forudsætning af ikke-automatisk bekræftelse af beskeder, hvis et vist antal beskeder (ved at sætte værdien af Qos baseret på forbrug eller kanal) ikke bekræftes, vil nye beskeder ikke blive forbrugt.
prefetchStørrelse: 0 prefetchCount: Fortæller RabbitMQ, at den ikke skal sende mere end N beskeder til en forbruger på samme tid, dvs. når der er N beskeder, der endnu ikke er acket, vil forbrugeren blokere, indtil der er en besked-ack global:true/false Uanset om ovenstående indstillinger anvendes på kanaler, for at sige det enkelt, om ovenstående begrænsninger gælder på kanalniveau eller på forbrugerniveau
Bemærk: Det siges, at prefetchSize og global ikke implementeres af rabbitmq, så jeg vil ikke studere dem foreløbig
prefetch_count træder i kraft, når no_ask=falsk,Det vil sige, i tilfælde af auto-svar er disse to værdierIkke i kraftaf
Sæt prefetchCount = 3 via BasicQos-metoden. Dette gør det muligt for RabbitMQ at behandle op til 3 beskeder pr. forbruger på én gang. Med andre ord vil den ikke distribuere nye beskeder til forbrugeren, før den modtager ack'en. Sådan sætter du det op:
Som du kan se på figuren, er der to forbrugere, der lytter til Queue samtidig, men bemærk, at beskeden her kun automatisk bliver acceket, hvis den forbruges af én forbruger, og den anden forbruger vil ikke modtage denne besked igen.
Officiel hjemmesideintroduktion: http://www.rabbitmq.com/consumer-prefetch.html
Bemærk, at denne metode kan få køen til at være fyldt. Selvfølgelig kan det være, du skal tilføje flere Consumers eller oprette flere virtualHosts for at forfine dit design.
|