Med eksemplet og pseudokoden du har givet, lad os forestille os at:
- den
recipient.user1
får 60 beskeder i minuttet - og
perform_task()
metoden tager 2 sekunder at udføre.
Det, der vil ske her, er indlysende:forsinkelsen mellem en ny besked, der kommer ind, og at den bliver behandlet, vil kun vokse over tid og drive længere og længere fra "realtidsbehandling".
system throughput = 30 messages/minute
For at komme uden om dette, vil du måske oprette en forbrugergruppe for user1
. Her kunne du have 4 forskellige python-processer kørende parallelt med alle 4 sluttet i samme gruppe for user1
. Nu når der kommer en besked til user1
en af de 4 arbejdere vil samle det op og perform_task()
.
system throughput = 120 message/minute
I dit eksempel er message.acknowledge()
eksisterer faktisk ikke, fordi din stream-læser er alene (XREAD-kommandoer).
Hvis det var en gruppe, bliver bekræftelsen af beskeder essentiel, det er sådan, redis ved, at et af gruppemedlemmerne faktisk håndterede den besked, så den kan "gå videre" (den kan glemme det faktum, at beskeden afventede bekræftelse) . Når du bruger grupper, er der en lille smule logik på serversiden for at sikre, at hver besked bliver leveret til en af forbrugergruppens medarbejdere én gang (XGROUPREAD-kommandoer). Når klienten er færdig, udsteder den en bekræftelse af denne besked (XACK-kommandoer), så serversidens "forbrugergruppebuffer" kan slette den og gå videre.
Forestil dig, hvis en arbejder døde og aldrig anerkendte beskeden. Med en forbrugergruppe er du i stand til at passe på denne situation (ved hjælp af XPENDING-kommandoer) og handle på dem ved for eksempel at prøve igen at behandle den samme besked i en anden forbruger.
Når du ikke bruger grupper, behøver redis-serveren ikke at "gå videre", "anerkendelsen" bliver 100 % klientside/forretningslogik.