Redis Stream - áreiðanleiki og sveigjanleiki skilaboðakerfa þinna

Redis Stream - áreiðanleiki og sveigjanleiki skilaboðakerfa þinna

Redis Stream er ný abstrakt gagnategund kynnt í Redis með útgáfu 5.0
Hugmyndalega er Redis Stream listi sem þú getur bætt færslum við. Hver færsla hefur einstakt auðkenni. Sjálfgefið er að auðkennið er sjálfkrafa búið til og inniheldur tímastimpil. Þess vegna er hægt að spyrjast fyrir um svið skráa með tímanum, eða fá ný gögn þegar þau berast í strauminn, líkt og Unix "tail -f" skipunin les annálaskrá og frýs á meðan beðið er eftir nýjum gögnum. Athugaðu að margir viðskiptavinir geta hlustað á þráð á sama tíma, alveg eins og margir "tail -f" ferli geta lesið skrá samtímis án þess að stangast á við hvert annað.

Til að skilja alla kosti nýju gagnategundarinnar skulum við líta fljótt á Redis-skipulagið sem hefur verið til lengi og endurtaka að hluta til virkni Redis Stream.

Redis PUB/SUB

Redis Pub/Sub er einfalt skilaboðakerfi sem þegar er innbyggt í lykilgildisverslunina þína. Hins vegar hefur einfaldleikinn sitt verð:

  • Ef útgefandinn mistekst af einhverjum ástæðum þá missir hann alla áskrifendur sína
  • Útgefandi þarf að vita nákvæmlega heimilisfang allra áskrifenda hans
  • Útgefandi kann að ofhlaða áskrifendum sínum vinnu ef gögn eru birt hraðar en unnið er úr þeim
  • Skilaboðinu er eytt úr biðminni útgefanda strax eftir birtingu, óháð því hversu marga áskrifendur þau voru afhent og hversu hratt þeir gátu afgreitt þessi skilaboð.
  • Allir áskrifendur fá skilaboðin á sama tíma. Áskrifendur verða sjálfir á einhvern hátt að koma sér saman um röð afgreiðslu sömu skilaboða.
  • Það er engin innbyggð aðferð til að staðfesta að áskrifandi hafi unnið úr skilaboðum. Ef áskrifandi fær skilaboð og hrynur við vinnslu mun útgefandinn ekki vita af því.

Redis Listi

Redis List er gagnaskipulag sem styður læsingarskipanir. Þú getur bætt við og lesið skilaboð frá upphafi eða enda listans. Byggt á þessari uppbyggingu geturðu búið til góðan stafla eða biðröð fyrir dreifða kerfið þitt og í flestum tilfellum dugar þetta. Helsti munurinn á Redis Pub/Sub:

  • Skilaboðin eru send til eins viðskiptavinar. Fyrsti lesblokkaði viðskiptavinurinn fær gögnin fyrst.
  • Clint verður sjálfur að hefja lestraraðgerðina fyrir hvert skeyti. List veit ekkert um viðskiptavini.
  • Skilaboð eru geymd þar til einhver les þau eða eyðir þeim beinlínis. Ef þú stillir Redis netþjóninn til að skola gögnum yfir á disk, þá eykst áreiðanleiki kerfisins verulega.

Kynning á Stream

Að bæta færslu við straum

Team XADD bætir nýrri færslu við strauminn. Skrá er ekki bara strengur, hún samanstendur af einu eða fleiri lykilgildapörum. Þannig er hver færsla þegar uppbyggð og líkist uppbyggingu CSV skráar.

> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0

Í dæminu hér að ofan bætum við tveimur sviðum við strauminn með nafninu (lykill) „mystream“: „sensor-id“ og „hitastig“ með gildunum „1234“ og „19.8“, í sömu röð. Sem önnur rök tekur skipunin auðkenni sem verður úthlutað færslunni - þetta auðkenni auðkennir hverja færslu í straumnum á einkvæman hátt. Hins vegar, í þessu tilfelli, fórum við framhjá * vegna þess að við viljum að Redis búi til nýtt auðkenni fyrir okkur. Hvert nýtt auðkenni mun hækka. Þess vegna mun hver ný færsla hafa hærra auðkenni miðað við fyrri færslur.

Auðkennissnið

Innsláttarauðkennið sem skipunin skilaði XADD, samanstendur af tveimur hlutum:

{millisecondsTime}-{sequenceNumber}

millisekúndurTími — Unix tími í millisekúndum (Redis miðlaratími). Hins vegar, ef núverandi tími er sá sami eða minni en tími fyrri upptöku, þá er tímastimpill fyrri upptöku notaður. Þess vegna, ef miðlaratíminn fer aftur í tímann, mun nýja auðkennið enn halda aukaeigninni.

Raðnúmer notað fyrir færslur sem eru búnar til á sömu millisekúndu. Raðnúmer hækki um 1 miðað við fyrri færslu. Vegna þess að Raðnúmer er 64 bitar að stærð, þá ættir þú í reynd ekki að lenda í takmörkunum á fjölda færslur sem hægt er að búa til á einni millisekúndu.

Snið slíkra auðkenna kann að virðast undarlegt við fyrstu sýn. Vantraustur lesandi gæti velt því fyrir sér hvers vegna tíminn er hluti af auðkenninu. Ástæðan er sú að Redis straumar styðja sviðsfyrirspurnir eftir auðkenni. Þar sem auðkennið er tengt þeim tíma sem skráin var búin til gerir þetta mögulegt að spyrjast fyrir um tímabil. Við skoðum ákveðið dæmi þegar við skoðum skipunina XRANGE.

Ef af einhverjum ástæðum þarf notandinn að tilgreina eigin auðkenni, sem til dæmis er tengt einhverju ytra kerfi, þá getum við sent það til skipunarinnar XADD í stað * eins og sýnt er hér að neðan:

> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2

Vinsamlegast athugið að í þessu tilviki verður þú að fylgjast með auðkennisaukningunni sjálfur. Í dæminu okkar er lágmarksauðkenni "0-1", þannig að skipunin samþykkir ekki annað auðkenni sem er jafnt eða minna en "0-1".

> XADD somestream 0-1 foo bar
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item

Fjöldi skráa á hvern straum

Það er hægt að fá fjölda færslur í straumi einfaldlega með því að nota skipunina XLEN. Fyrir dæmið okkar mun þessi skipun skila eftirfarandi gildi:

> XLEN somestream
(integer) 2

Range fyrirspurnir - XRANGE og XREVRANGE

Til að biðja um gögn eftir svið þurfum við að tilgreina tvö auðkenni - upphaf og lok sviðsins. Sviðið sem skilað er mun innihalda alla þætti, þar á meðal mörkin. Það eru líka tvö sérstök auðkenni „-“ og „+“, í sömu röð sem þýðir minnsta (fyrsta skrá) og stærsta (síðasta skrá) auðkenni straumsins. Dæmið hér að neðan mun skrá allar straumfærslurnar.

> XRANGE mystream - +
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"
2) 1) 1518951482479-0
   2) 1) "sensor-id"
      2) "9999"
      3) "temperature"
      4) "18.2"

Hver skilað skrá er fylki tveggja þátta: auðkenni og listi yfir lykilgildapör. Við höfum þegar sagt að skráaauðkenni séu tengd tíma. Þess vegna getum við beðið um ákveðið tímabil. Hins vegar getum við tilgreint í beiðninni ekki fullt auðkenni, heldur aðeins Unix tíma, sleppt hlutanum sem tengist Raðnúmer. Sleppti hluti auðkennisins verður sjálfkrafa stilltur á núll í upphafi sviðsins og á hámarks mögulega gildi í lok sviðsins. Hér að neðan er dæmi um hvernig þú getur beðið um tveggja millisekúndna bil.

> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

Við höfum aðeins eina færslu á þessu sviði, en í raunverulegum gagnasöfnum getur niðurstaðan sem skilað er verið mikil. Af þessari ástæðu XRANGE styður valkostinn COUNT. Með því að tilgreina magnið getum við einfaldlega fengið fyrstu N færslurnar. Ef við þurfum að fá næstu N færslur (blaðsíðuskiptingu) getum við notað síðasta móttekna auðkenni, aukið það Raðnúmer einn og spyr aftur. Við skulum skoða þetta í eftirfarandi dæmi. Við byrjum að bæta við 10 þáttum með XADD (að því gefnu að mystream hafi þegar verið fyllt með 10 þáttum). Til að hefja endurtekninguna og fá 2 þætti í hverja skipun, byrjum við á öllu sviðinu en með COUNT sem er jafnt og 2.

> XRANGE mystream - + COUNT 2
1) 1) 1519073278252-0
   2) 1) "foo"
      2) "value_1"
2) 1) 1519073279157-0
   2) 1) "foo"
      2) "value_2"

Til að halda áfram að endurtaka með næstu tveimur þáttum þurfum við að velja síðasta auðkenni sem við fengum, þ.e. 1519073279157-0, og bæta 1 við Raðnúmer.
Nú er hægt að nota auðkennið sem myndast, í þessu tilviki 1519073279157-1, sem ný upphafssviðsrök fyrir næsta símtal XRANGE:

> XRANGE mystream 1519073279157-1 + COUNT 2
1) 1) 1519073280281-0
   2) 1) "foo"
      2) "value_3"
2) 1) 1519073281432-0
   2) 1) "foo"
      2) "value_4"

Og svo framvegis. Vegna þess að margbreytileiki XRANGE er O(log(N)) til að leita og svo O(M) til að skila M þáttum, þá er hvert endurtekningarskref hratt. Þannig að nota XRANGE Hægt er að endurtaka strauma á skilvirkan hátt.

Team XREVRANGE er ígildi XRANGE, en skilar þáttunum í öfugri röð:

> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
   2) 1) "foo"
      2) "value_10"

Vinsamlegast athugaðu að skipunin XREVRANGE tekur sviðsrök upphaf og stöðvun í öfugri röð.

Að lesa nýjar færslur með XREAD

Oft er það verkefni að gerast áskrifandi að straumi og fá aðeins ný skilaboð. Þetta hugtak kann að virðast svipað og Redis Pub/Sub eða að hindra Redis List, en það er grundvallarmunur á því hvernig á að nota Redis Stream:

  1. Hver ný skilaboð eru sjálfgefið afhent hverjum áskrifanda. Þessi hegðun er frábrugðin Redis Listi sem lokar á, þar sem ný skilaboð verða aðeins lesin af einum áskrifanda.
  2. Þó að í Redis Pub/Sub séu öll skilaboð gleymd og haldist aldrei, í Stream eru öll skilaboð geymd um óákveðinn tíma (nema viðskiptavinurinn valdi beinlínis eyðingu).
  3. Redis Stream gerir þér kleift að aðgreina aðgang að skilaboðum innan eins straums. Tiltekinn áskrifandi getur aðeins séð persónulega skilaboðasögu sína.

Þú getur gerst áskrifandi að þræði og fengið ný skilaboð með skipuninni XLESA. Það er aðeins flóknara en XRANGE, svo við byrjum á einfaldari dæmunum fyrst.

> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1519073278252-0
         2) 1) "foo"
            2) "value_1"
      2) 1) 1519073279157-0
         2) 1) "foo"
            2) "value_2"

Dæmið hér að ofan sýnir eyðublað sem ekki er læst XLESA. Athugaðu að COUNT valkosturinn er valfrjáls. Reyndar er eini nauðsynlegi skipunarvalkosturinn STREAMS valkosturinn, sem tilgreinir lista yfir strauma ásamt samsvarandi hámarksauðkenni. Við skrifuðum „STREAMS mystream 0“ - við viljum fá allar skrár yfir mystream strauminn með auðkenni sem er stærra en „0-0“. Eins og þú sérð í dæminu skilar skipunin nafni þráðarins vegna þess að við getum gerst áskrifandi að mörgum þráðum á sama tíma. Við gætum skrifað, til dæmis, "STREAMS mystream otherstream 0 0". Vinsamlegast athugaðu að á eftir STREAMS valkostinum þurfum við fyrst að gefa upp nöfn allra nauðsynlegra strauma og aðeins síðan lista yfir auðkenni.

Í þessu einfalda formi gerir skipunin ekkert sérstakt miðað við XRANGE. Hins vegar er það áhugaverða að við getum auðveldlega snúið okkur XLESA í blokkunarskipun, sem tilgreinir BLOCK rökin:

> XREAD BLOCK 0 STREAMS mystream $

Í dæminu hér að ofan er nýr BLOCK valkostur tilgreindur með 0 millisekúndum tíma (það þýðir að bíða endalaust). Þar að auki, í stað þess að senda venjulega auðkenni fyrir strauminn mystream, var sérstakt auðkenni $ sent. Þetta sérstaka auðkenni þýðir það XLESA verður að nota hámarksauðkennið í mystream sem auðkenni. Þannig að við munum aðeins fá ný skilaboð frá því augnabliki sem við byrjuðum að hlusta. Að sumu leyti er þetta svipað Unix "tail -f" skipuninni.

Athugaðu að þegar þú notar BLOCK valkostinn þurfum við ekki endilega að nota sérstaka auðkennið $. Við getum notað hvaða auðkenni sem er til staðar í straumnum. Ef teymið getur afgreitt beiðni okkar strax án þess að loka, mun það gera það, annars lokast það.

Lokun XLESA getur líka hlustað á marga þræði í einu, þú þarft bara að tilgreina nöfn þeirra. Í þessu tilviki mun skipunin skila skrá yfir fyrsta strauminn sem fékk gögn. Fyrsti áskrifandinn sem er lokaður fyrir tiltekinn þráð mun fyrst fá gögn.

Neytendahópar

Í ákveðnum verkefnum viljum við takmarka aðgang áskrifenda að skilaboðum innan eins þráðs. Dæmi þar sem þetta gæti verið gagnlegt er skilaboðaröð með starfsmönnum sem munu fá mismunandi skilaboð frá þræði, sem gerir skilaboðavinnslu kleift að stækka.

Ef við ímyndum okkur að við höfum þrjá áskrifendur C1, C2, C3 og þráð sem inniheldur skilaboð 1, 2, 3, 4, 5, 6, 7, þá verða skilaboðin birt eins og á skýringarmyndinni hér að neðan:

1 -> C1
2 -> C2
3 -> C3
4 -> C1
5 -> C2
6 -> C3
7 -> C1

Til að ná þessum áhrifum notar Redis Stream hugtak sem kallast Consumer Group. Þetta hugtak er svipað og gerviáskrifandi, sem fær gögn frá straumi, en er í raun þjónað af mörgum áskrifendum innan hóps, sem veitir ákveðnar tryggingar:

  1. Hver skilaboð eru send til mismunandi áskrifanda innan hópsins.
  2. Innan hóps eru áskrifendur auðkenndir með nafni sínu, sem er hástafanæmur strengur. Ef áskrifandi hættir tímabundið úr hópnum er hægt að koma honum aftur inn í hópinn með sínu eigin nafni.
  3. Sérhver neytendahópur fylgir hugmyndinni „fyrstu ólesnu skilaboðin“. Þegar áskrifandi biður um ný skilaboð getur hann aðeins tekið á móti skilaboðum sem hafa aldrei áður verið afhent neinum áskrifanda innan hópsins.
  4. Það er skipun til að staðfesta beinlínis að áskrifandinn hafi unnið úr skilaboðunum. Þar til þessi skipun er kölluð verða umbeðin skilaboð áfram í stöðunni „í bið“.
  5. Innan neytendahópsins getur hver áskrifandi beðið um feril skilaboða sem voru send til hans, en hafa ekki enn verið afgreidd (í stöðunni „í bið“)

Í vissum skilningi er hægt að tjá stöðu hópsins sem hér segir:

+----------------------------------------+
| consumer_group_name: mygroup          
| consumer_group_stream: somekey        
| last_delivered_id: 1292309234234-92    
|                                                           
| consumers:                                          
|    "consumer-1" with pending messages  
|       1292309234234-4                          
|       1292309234232-8                          
|    "consumer-42" with pending messages 
|       ... (and so forth)                             
+----------------------------------------+

Nú er kominn tími til að kynna sér helstu skipanir neytendahópsins, þ.e.

  • XGROUP notað til að búa til, eyðileggja og stjórna hópum
  • XREADGROUP notað til að lesa streymi í gegnum hóp
  • XACK - þessi skipun gerir áskrifandanum kleift að merkja skilaboðin sem unnin

Stofnun neytendahóps

Gerum ráð fyrir að mystream sé þegar til. Þá mun hópstofnunarskipunin líta svona út:

> XGROUP CREATE mystream mygroup $
OK

Þegar hópur er stofnaður verðum við að gefa auðkenni, sem byrjar á því að hópurinn fær skilaboð. Ef við viljum bara fá öll ný skilaboð, þá getum við notað sérstaka auðkennið $ (eins og í dæminu okkar hér að ofan). Ef þú tilgreinir 0 í stað sérstaks auðkennis, þá verða öll skilaboð í þræðinum aðgengileg hópnum.

Nú þegar hópurinn er búinn til getum við strax byrjað að lesa skilaboð með skipuninni XREADGROUP. Þessi skipun er mjög svipuð XLESA og styður valfrjálsan BLOCK valkostinn. Hins vegar er nauðsynlegur GRÓP valkostur sem verður alltaf að vera tilgreindur með tveimur rökum: nafn hópsins og nafn áskrifanda. COUNT valkosturinn er einnig studdur.

Áður en við lesum þráðinn skulum við setja nokkur skilaboð þar:

> XADD mystream * message apple
1526569495631-0
> XADD mystream * message orange
1526569498055-0
> XADD mystream * message strawberry
1526569506935-0
> XADD mystream * message apricot
1526569535168-0
> XADD mystream * message banana
1526569544280-0

Nú skulum við reyna að lesa þennan straum í gegnum hópinn:

> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

Ofangreind skipun hljóðar orðrétt sem hér segir:

„Ég, áskrifandinn Alice, meðlimur í mygroup, vil lesa ein skilaboð frá mystream sem hefur aldrei verið afhent neinum áður.

Í hvert sinn sem áskrifandi framkvæmir aðgerð á hópi verður hann að gefa upp nafn sitt, sem auðkennir sjálfan sig innan hópsins. Það er enn eitt mjög mikilvægt smáatriði í skipuninni hér að ofan - sérstaka auðkennið ">". Þetta sérstaka auðkenni síar skilaboð og skilur aðeins eftir þau sem aldrei hafa verið afhent áður.

Einnig, í sérstökum tilfellum, geturðu tilgreint raunverulegt auðkenni eins og 0 eða annað gilt auðkenni. Í þessu tilviki skipunin XREADGROUP mun skila þér feril skilaboða með stöðuna "í bið" sem voru afhent tilgreindum áskrifanda (Alice) en hafa ekki enn verið staðfest með skipuninni XACK.

Við getum prófað þessa hegðun með því að tilgreina auðkennið 0 strax, án þess að hafa valkost COUNT. Við munum einfaldlega sjá ein skilaboð í bið, það er epli skilaboðin:

> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

Hins vegar, ef við staðfestum að skilaboðin hafi tekist að vinna, þá munu þau ekki lengur birtast:

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) (empty list or set)

Nú er komið að Bob að lesa eitthvað:

> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569498055-0
         2) 1) "message"
            2) "orange"
      2) 1) 1526569506935-0
         2) 1) "message"
            2) "strawberry"

Bob, meðlimur í mygroup, bað ekki um fleiri en tvö skilaboð. Skipunin tilkynnir aðeins óafhent skilaboð vegna sérstaks auðkennis ">". Eins og þú sérð munu skilaboðin „epli“ ekki birtast þar sem það hefur þegar verið afhent Alice, svo Bob fær „appelsínugult“ og „jarðarber“.

Þannig geta Alice, Bob og allir aðrir áskrifendur að hópnum lesið mismunandi skilaboð úr sama straumnum. Þeir geta líka lesið sögu þeirra um óunnin skilaboð eða merkt skilaboð sem unnin.

Það eru nokkur atriði sem þarf að hafa í huga:

  • Um leið og áskrifandi telur skilaboðin vera skipun XREADGROUP, þessi skilaboð fara í stöðuna „í bið“ og er úthlutað þeim áskrifanda. Aðrir hópáskrifendur munu ekki geta lesið þessi skilaboð.
  • Áskrifendur eru sjálfkrafa búnir til þegar þeir eru nefndir fyrst, það er engin þörf á að búa þá til sérstaklega.
  • Með XREADGROUP þú getur lesið skilaboð frá mörgum mismunandi þráðum á sama tíma, en til að þetta virki þarftu fyrst að búa til hópa með sama nafni fyrir hvern þráð með því að nota XGROUP

Bati eftir bilun

Áskrifandinn getur jafnað sig eftir bilunina og endurlesið listann yfir skilaboð með stöðunni „í bið“. Hins vegar, í hinum raunverulega heimi, geta áskrifendur að lokum mistekist. Hvað verður um fast skilaboð áskrifanda ef áskrifandinn getur ekki jafnað sig eftir bilun?
Consumer Group býður upp á eiginleika sem er notaður einmitt fyrir slík tilvik - þegar þú þarft að skipta um eiganda skilaboða.

Það fyrsta sem þú þarft að gera er að hringja í skipunina XPENDING, sem sýnir öll skilaboð í hópnum með stöðuna „í bið“. Í sinni einföldustu mynd er skipunin kölluð með aðeins tveimur rökum: þráðarnafninu og hópheitinu:

> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
      2) "2"

Teymið sýndi fjölda óunninna skilaboða fyrir allan hópinn og fyrir hvern áskrifanda. Við höfum aðeins Bob með tvö útistandandi skilaboð vegna þess að eina skilaboðin sem Alice bað um var staðfest með XACK.

Við getum beðið um frekari upplýsingar með því að nota fleiri rök:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - svið auðkenna (þú getur notað „-“ og „+“)
{count} — fjöldi sendingartilrauna
{neytendanafn} - nafn hóps

> XPENDING mystream mygroup - + 10
1) 1) 1526569498055-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1
2) 1) 1526569506935-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1

Nú höfum við upplýsingar um hvert skeyti: auðkenni, nafn áskrifanda, aðgerðalaus tími í millisekúndum og að lokum fjölda sendingartilrauna. Við höfum tvö skilaboð frá Bob og þau hafa verið aðgerðalaus í 74170458 millisekúndur, um 20 klukkustundir.

Vinsamlegast athugaðu að enginn hindrar okkur í að athuga hvað innihald skilaboðanna var einfaldlega með því að nota XRANGE.

> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

Við verðum bara að endurtaka sama auðkennið tvisvar í rökunum. Nú þegar við höfum einhverja hugmynd gæti Alice ákveðið að eftir 20 klukkustunda niður í miðbæ muni Bob líklega ekki jafna sig og það er kominn tími til að spyrjast fyrir um þessi skilaboð og halda áfram að vinna úr þeim fyrir Bob. Til þess notum við skipunina XCLAIM:

XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}

Með því að nota þessa skipun getum við fengið „erlend“ skilaboð sem ekki hafa enn verið unnin með því að breyta eigandanum í {neytandi}. Hins vegar getum við einnig gefið upp lágmarksaðgerðartíma {min-idle-time}. Þetta hjálpar til við að forðast aðstæður þar sem tveir viðskiptavinir reyna að breyta eiganda sömu skilaboða samtímis:

Client 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Clinet 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0

Fyrsti viðskiptavinurinn mun endurstilla niðurtímann og hækka afhendingarteljarann. Svo seinni viðskiptavinurinn mun ekki geta beðið um það.

> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

Skilaboðin voru tekin tilkall til Alice, sem getur nú unnið úr skilaboðunum og viðurkennt þau.

Frá ofangreindu dæmi geturðu séð að vel heppnuð beiðni skilar innihaldi skilaboðanna sjálfs. Hins vegar er þetta ekki nauðsynlegt. Hægt er að nota JUSTID valkostinn til að skila skilaboðaauðkennum eingöngu. Þetta er gagnlegt ef þú hefur ekki áhuga á smáatriðum skilaboðanna og vilt auka afköst kerfisins.

Afhendingarteljari

Teljarinn sem þú sérð í úttakinu XPENDING er fjöldi sendinga hvers skeytis. Slíkur teljari er aukinn á tvo vegu: þegar beðið er um skilaboð í gegnum XCLAIM eða þegar símtal er notað XREADGROUP.

Það er eðlilegt að sum skilaboð séu afhent mörgum sinnum. Aðalatriðið er að öll skilaboð séu á endanum unnin. Stundum koma upp vandamál við vinnslu skilaboða vegna þess að skilaboðin sjálf eru skemmd, eða vinnsla skilaboða veldur villu í meðhöndlunarkóða. Í þessu tilviki getur komið í ljós að enginn getur afgreitt þessi skilaboð. Þar sem við erum með afhendingartilraunateljara getum við notað þennan teljara til að greina slíkar aðstæður. Þess vegna, þegar sendingafjöldinn nær þeirri háu tölu sem þú tilgreinir, væri líklega skynsamlegra að setja slík skilaboð á annan þráð og senda tilkynningu til kerfisstjórans.

Þráðaríki

Team XINFO notað til að óska ​​eftir ýmsum upplýsingum um þráð og hópa hans. Til dæmis lítur grunnskipun svona út:

> XINFO STREAM mystream
 1) length
 2) (integer) 13
 3) radix-tree-keys
 4) (integer) 1
 5) radix-tree-nodes
 6) (integer) 2
 7) groups
 8) (integer) 2
 9) first-entry
10) 1) 1524494395530-0
    2) 1) "a"
       2) "1"
       3) "b"
       4) "2"
11) last-entry
12) 1) 1526569544280-0
    2) 1) "message"
       2) "banana"

Skipunin hér að ofan sýnir almennar upplýsingar um tilgreindan straum. Nú aðeins flóknara dæmi:

> XINFO GROUPS mystream
1) 1) name
   2) "mygroup"
   3) consumers
   4) (integer) 2
   5) pending
   6) (integer) 2
2) 1) name
   2) "some-other-group"
   3) consumers
   4) (integer) 1
   5) pending
   6) (integer) 0

Skipunin hér að ofan sýnir almennar upplýsingar fyrir alla hópa tilgreinds þráðs

> XINFO CONSUMERS mystream mygroup
1) 1) name
   2) "Alice"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 9104628
2) 1) name
   2) "Bob"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 83841983

Skipunin hér að ofan sýnir upplýsingar fyrir alla áskrifendur tilgreinds straums og hóps.
Ef þú gleymir skipanasetningafræðinni skaltu bara biðja skipunina sjálfa um hjálp:

> XINFO HELP
1) XINFO {subcommand} arg arg ... arg. Subcommands are:
2) CONSUMERS {key} {groupname}  -- Show consumer groups of group {groupname}.
3) GROUPS {key}                 -- Show the stream consumer groups.
4) STREAM {key}                 -- Show information about the stream.
5) HELP                         -- Print this help.

Stærðartakmörk straums

Mörg forrit vilja ekki safna gögnum í straum að eilífu. Oft er gagnlegt að hafa hámarksfjölda skilaboða sem leyfður er á hvern þráð. Í öðrum tilfellum er gagnlegt að færa öll skilaboð úr þræði yfir í aðra viðvarandi geymslu þegar tilgreindri þráðarstærð er náð. Þú getur takmarkað stærð straums með því að nota MAXLEN færibreytuna í skipuninni XADD:

> XADD mystream MAXLEN 2 * value 1
1526654998691-0
> XADD mystream MAXLEN 2 * value 2
1526654999635-0
> XADD mystream MAXLEN 2 * value 3
1526655000369-0
> XLEN mystream
(integer) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

Þegar MAXLEN er notað er gömlum færslum sjálfkrafa eytt þegar þær ná ákveðinni lengd, þannig að straumurinn hefur stöðuga stærð. Hins vegar gerist klipping í þessu tilfelli ekki á skilvirkasta hátt í Redis minni. Þú getur bætt ástandið sem hér segir:

XADD mystream MAXLEN ~ 1000 * ... entry fields here ...

~ rökin í dæminu hér að ofan þýðir að við þurfum ekki endilega að takmarka straumlengdina við ákveðið gildi. Í okkar dæmi gæti þetta verið hvaða tala sem er stærri en eða jöfn 1000 (til dæmis 1000, 1010 eða 1030). Við tilgreindum bara sérstaklega að við viljum að straumurinn okkar geymi að minnsta kosti 1000 færslur. Þetta gerir minnisstjórnun mun skilvirkari innan Redis.

Það er líka sérstakt lið XTRIM, sem gerir það sama:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

Viðvarandi geymsla og afritun

Redis Stream er ósamstilltur afritaður í þrælahnúta og vistaður í skrár eins og AOF (skyndimynd af öllum gögnum) og RDB (skrá yfir allar skrifaaðgerðir). Afritun neytendahópa er einnig studd. Þess vegna, ef skilaboð eru í „bið“ stöðu á aðalhnút, þá mun þessi skilaboð hafa sömu stöðu á þrælhnútum.

Fjarlægir einstaka þætti úr straumi

Það er sérstök skipun til að eyða skilaboðum XDEL. Skipunin fær nafn þráðarins og síðan skilaboðaauðkennin sem á að eyða:

> XRANGE mystream - + COUNT 2
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"
> XDEL mystream 1526654999635-0
(integer) 1
> XRANGE mystream - + COUNT 2
1) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

Þegar þú notar þessa skipun þarftu að taka með í reikninginn að raunverulegt minni losnar ekki strax.

Núll lengd straumar

Munurinn á straumum og öðrum Redis gagnabyggingum er sá að þegar önnur gagnaskipulag hafa ekki lengur þætti innan sér, sem aukaverkun, verður gagnaskipulagið sjálft fjarlægt úr minni. Svo, til dæmis, verður flokkaða settið alveg fjarlægt þegar ZREM símtalið fjarlægir síðasta þáttinn. Þess í stað er þráðum leyft að vera í minni jafnvel án þess að hafa neina þætti inni.

Ályktun

Redis Stream er tilvalið til að búa til skilaboðamiðlara, skilaboðabiðraðir, sameinaða skráningu og spjallkerfi til að halda sögu.

Eins og ég sagði einu sinni Niklaus Wirth, forrit eru reiknirit auk gagnaskipulags og Redis gefur þér nú þegar bæði.

Heimild: www.habr.com

Bæta við athugasemd