sql >> Database teknologi >  >> NoSQL >> Redis

Fejlsikker meddelelsesudsendelse, der skal forbruges af en specifik modtager ved hjælp af redis og python

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.




  1. MongoDB db.collection.count()

  2. Mongoose findByIdAndUpdate returnerer ikke korrekt model

  3. MongoDB Erstat specifikke matrixværdier

  4. Er der MGET-analog til Redis-hash?