Redis Stream ir jauns abstrakts datu veids, kas ieviests Redis ar versiju 5.0
KonceptuÄli Redis Stream ir saraksts, kuram varat pievienot ierakstus. Katram ierakstam ir unikÄls identifikators. PÄc noklusÄjuma ID tiek Ä£enerÄts automÄtiski un ietver laikspiedolu. TÄpÄc jÅ«s varat vaicÄt ierakstu diapazonus laika gaitÄ vai saÅemt jaunus datus, tiklÄ«dz tie nonÄk straumÄ, lÄ«dzÄ«gi kÄ Unix komanda "tail -f" nolasa žurnÄla failu un sasalst, gaidot jaunus datus. Å
emiet vÄrÄ, ka vairÄki klienti var klausÄ«ties pavedienu vienlaikus, tÄpat kÄ daudzi "tail -f" procesi var nolasÄ«t failu vienlaikus, neradot konfliktus vienam ar otru.
Lai saprastu visas jaunÄ datu veida priekÅ”rocÄ«bas, Ä«si apskatÄ«sim jau sen pastÄvoÅ”Äs Redis struktÅ«ras, kas daļÄji atkÄrto Redis Stream funkcionalitÄti.
Redis PUB/SUB
Redis Pub/Sub ir vienkÄrÅ”a ziÅojumapmaiÅas sistÄma, kas jau ir iebÅ«vÄta jÅ«su atslÄgu vÄrtÄ«bu veikalÄ. TomÄr vienkÄrŔībai ir sava cena:
- Ja izdevÄjam kÄda iemesla dÄļ neizdodas, viÅÅ” zaudÄ visus savus abonentus
- IzdevÄjam ir jÄzina precÄ«za visu savu abonentu adrese
- IzdevÄjs var pÄrslogot savus abonentus ar darbu, ja dati tiek publicÄti ÄtrÄk, nekÄ tie tiek apstrÄdÄti
- ZiÅojums tiek dzÄsts no izdevÄja bufera tÅ«lÄ«t pÄc publicÄÅ”anas neatkarÄ«gi no tÄ, cik abonentiem tas tika piegÄdÄts un cik Ätri viÅi varÄja apstrÄdÄt Å”o ziÅojumu.
- Visi abonenti saÅems ziÅu vienlaikus. PaÅ”iem abonentiem kaut kÄdÄ veidÄ jÄvienojas savÄ starpÄ par vienas ziÅas apstrÄdes kÄrtÄ«bu.
- Nav iebÅ«vÄta mehÄnisma, kas apstiprinÄtu, ka abonents ir veiksmÄ«gi apstrÄdÄjis ziÅojumu. Ja abonents saÅem ziÅojumu un apstrÄdes laikÄ avarÄ, izdevÄjs par to nezinÄs.
Redisa saraksts
Redis saraksts ir datu struktÅ«ra, kas atbalsta lasÄ«Å”anas komandu bloÄ·ÄÅ”anu. Varat pievienot un lasÄ«t ziÅas no saraksta sÄkuma vai beigÄm. Pamatojoties uz Å”o struktÅ«ru, jÅ«s varat izveidot labu steku vai rindu savai izplatÄ«tajai sistÄmai, un vairumÄ gadÄ«jumu ar to pietiks. GalvenÄs atŔķirÄ«bas no Redis Pub/Sub:
- ZiÅa tiek piegÄdÄta vienam klientam. Pirmais nolasÄ«Å”anas bloÄ·Ätais klients saÅems datus pirmais.
- Klintam paÅ”am ir jÄuzsÄk katra ziÅojuma lasÄ«Å”anas darbÄ«ba. Lists neko nezina par klientiem.
- ZiÅojumi tiek glabÄti, lÄ«dz kÄds tos izlasa vai nepÄrprotami izdzÄÅ”. Ja konfigurÄjat Redis serveri, lai izskalotu datus diskÄ, sistÄmas uzticamÄ«ba ievÄrojami palielinÄs.
Ievads pakalpojumÄ Stream
Ieraksta pievienoŔana straumei
Komanda XADD pievieno straumei jaunu ierakstu. Ieraksts nav tikai virkne, tas sastÄv no viena vai vairÄkiem atslÄgu-vÄrtÄ«bu pÄriem. TÄdÄjÄdi katrs ieraksts jau ir strukturÄts un atgÄdina CSV faila struktÅ«ru.
> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0
IepriekÅ” minÄtajÄ piemÄrÄ straumei pievienojam divus laukus ar nosaukumu (atslÄgu) āmystreamā: āsensor-idā un ātemperatÅ«raā ar vÄrtÄ«bÄm attiecÄ«gi ā1234ā un ā19.8ā. KÄ otro argumentu komanda Åem identifikatoru, kas tiks pieŔķirts ierakstam - Å”is identifikators unikÄli identificÄ katru ierakstu straumÄ. TomÄr Å”ajÄ gadÄ«jumÄ mÄs izturÄjÄm *, jo vÄlamies, lai Redis mums Ä£enerÄ jaunu ID. Katrs jauns ID palielinÄsies. TÄpÄc katram jaunajam ierakstam bÅ«s augstÄks identifikators salÄ«dzinÄjumÄ ar iepriekÅ”Äjiem ierakstiem.
Identifikatora formÄts
Komandas atgrieztais ieraksta ID XADD, sastÄv no divÄm daļÄm:
{millisecondsTime}-{sequenceNumber}
milisekundesLaiks ā Unix laiks milisekundÄs (Redis servera laiks). TomÄr, ja paÅ”reizÄjais laiks ir tÄds pats vai mazÄks nekÄ iepriekÅ”ÄjÄ ieraksta laiks, tiek izmantots iepriekÅ”ÄjÄ ieraksta laikspiedols. TÄpÄc, ja servera laiks atgriežas pagÄtnÄ, jaunais identifikators joprojÄm saglabÄs pieauguma rekvizÄ«tu.
secÄ«basNumber izmanto ierakstiem, kas izveidoti tajÄ paÅ”Ä milisekundÄ. secÄ«basNumber tiks palielinÄts par 1 attiecÄ«bÄ pret iepriekÅ”Äjo ierakstu. TÄpÄc ka secÄ«basNumber ir 64 biti liels, tad praksÄ nevajadzÄtu ierobežot ierakstu skaitu, ko var Ä£enerÄt vienas milisekundes laikÄ.
Å Ädu identifikatoru formÄts no pirmÄ acu uzmetiena var Ŕķist dÄ«vains. NeuzticÄ«gs lasÄ«tÄjs varÄtu brÄ«nÄ«ties, kÄpÄc laiks ir daļa no identifikatora. Iemesls ir tÄds, ka Redis straumes atbalsta diapazona vaicÄjumus pÄc ID. TÄ kÄ identifikators ir saistÄ«ts ar ieraksta izveides laiku, tas ļauj vaicÄt laika diapazonus. MÄs apskatÄ«sim konkrÄtu piemÄru, kad aplÅ«kosim komandu XRANGE.
Ja kÄda iemesla dÄļ lietotÄjam ir jÄnorÄda savs identifikators, kas, piemÄram, ir saistÄ«ts ar kÄdu ÄrÄju sistÄmu, tad mÄs varam to nodot komandai XADD * vietÄ, kÄ parÄdÄ«ts zemÄk:
> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2
LÅ«dzu, Åemiet vÄrÄ, ka Å”ajÄ gadÄ«jumÄ jums paÅ”am jÄuzrauga ID palielinÄjums. MÅ«su piemÄrÄ minimÄlais identifikators ir "0-1", tÄpÄc komanda nepieÅems citu identifikatoru, kas ir vienÄds ar "0-1" vai mazÄks par to.
> XADD somestream 0-1 foo bar
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item
Ierakstu skaits vienÄ straumÄ
Ir iespÄjams iegÅ«t ierakstu skaitu straumÄ, vienkÄrÅ”i izmantojot komandu XLEN. MÅ«su piemÄrÄ Å”Ä« komanda atgriezÄ«s Å”Ädu vÄrtÄ«bu:
> XLEN somestream
(integer) 2
Diapazona vaicÄjumi - XRANGE un XREVRANGE
Lai pieprasÄ«tu datus pÄc diapazona, mums ir jÄnorÄda divi identifikatori - diapazona sÄkums un beigas. Atgrieztais diapazons ietvers visus elementus, tostarp robežas. Ir arÄ« divi Ä«paÅ”i identifikatori ā-ā un ā+ā, kas attiecÄ«gi nozÄ«mÄ mazÄko (pirmais ieraksts) un lielÄko (pÄdÄjais ieraksts) identifikatoru straumÄ. TÄlÄk esoÅ”ajÄ piemÄrÄ bÅ«s uzskaitÄ«ti visi straumes ieraksti.
> 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"
Katrs atgrieztais ieraksts ir divu elementu masÄ«vs: identifikators un atslÄgu un vÄrtÄ«bu pÄru saraksts. MÄs jau teicÄm, ka ierakstu identifikatori ir saistÄ«ti ar laiku. TÄpÄc mÄs varam pieprasÄ«t noteikta laika perioda diapazonu. TaÄu pieprasÄ«jumÄ varam norÄdÄ«t nevis pilnu identifikatoru, bet tikai Unix laiku, izlaižot daļu, kas attiecas uz secÄ«basNumber. IzlaistÄ identifikatora daļa diapazona sÄkumÄ tiks automÄtiski iestatÄ«ta uz nulli un diapazona beigÄs uz maksimÄlo iespÄjamo vÄrtÄ«bu. TÄlÄk ir sniegts piemÄrs tam, kÄ varat pieprasÄ«t divu milisekundu diapazonu.
> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperature"
4) "19.8"
Å ajÄ diapazonÄ mums ir tikai viens ieraksts, taÄu reÄlos datu kopÄs atgrieztais rezultÄts var bÅ«t milzÄ«gs. Å Ä« iemesla dÄļ XRANGE atbalsta opciju COUNT. NorÄdot daudzumu, mÄs varam vienkÄrÅ”i iegÅ«t pirmos N ierakstus. Ja mums ir jÄiegÅ«st nÄkamie N ieraksti (lapu ŔķiroÅ”ana), varam izmantot pÄdÄjo saÅemto ID, to palielinÄt secÄ«basNumber pa vienam un jautÄ vÄlreiz. ApskatÄ«sim to nÄkamajÄ piemÄrÄ. MÄs sÄkam pievienot 10 elementus ar XADD (pieÅemot, ka mystream jau bija piepildÄ«ts ar 10 elementiem). Lai sÄktu iterÄciju, iegÅ«stot 2 elementus katrÄ komandÄ, mÄs sÄkam ar pilnu diapazonu, bet ar COUNT, kas vienÄds ar 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"
Lai turpinÄtu atkÄrtoÅ”anu ar nÄkamajiem diviem elementiem, mums ir jÄatlasa pÄdÄjais saÅemtais ID, t.i., 1519073279157-0, un jÄpievieno 1. secÄ«basNumber.
IegÅ«to ID, Å”ajÄ gadÄ«jumÄ 1519073279157-1, tagad var izmantot kÄ jauno diapazona sÄkuma argumentu nÄkamajam izsaukumam. 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"
Un tÄ tÄlÄk. SarežģītÄ«bas dÄļ XRANGE ir O(log(N)), lai meklÄtu un pÄc tam O(M), lai atgrieztu M elementus, tad katrs iterÄcijas solis ir Ätrs. TÄdÄjÄdi, izmantojot XRANGE straumes var efektÄ«vi atkÄrtot.
Komanda XREVRANGE ir lÄ«dzvÄrtÄ«gs XRANGE, bet atgriež elementus apgrieztÄ secÄ«bÄ:
> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
2) 1) "foo"
2) "value_10"
LÅ«dzu, Åemiet vÄrÄ, ka komanda XREVRANGE Åem diapazona argumentus sÄkuma un beigÅ”anas apgrieztÄ secÄ«bÄ.
Jaunu ierakstu lasīŔana, izmantojot XREAD
Bieži vien rodas uzdevums abonÄt straumi un saÅemt tikai jaunas ziÅas. Å is jÄdziens var Ŕķist lÄ«dzÄ«gs Redis Pub/Sub vai Redis List bloÄ·ÄÅ”anai, taÄu Redis Stream lietoÅ”anÄ ir bÅ«tiskas atŔķirÄ«bas:
- Katra jauna ziÅa pÄc noklusÄjuma tiek piegÄdÄta katram abonentam. Å Ä« darbÄ«ba atŔķiras no bloÄ·ÄjoÅ”Ä Redis saraksta, kurÄ jaunu ziÅojumu lasÄ«s tikai viens abonents.
- KamÄr pakalpojumÄ Redis Pub/Sub visi ziÅojumi tiek aizmirsti un nekad netiek saglabÄti, pakalpojumÄ Stream visi ziÅojumi tiek saglabÄti neierobežotu laiku (ja vien klients nepÄrprotami neizraisa dzÄÅ”anu).
- Redis Stream ļauj atŔķirt piekļuvi ziÅojumiem vienÄ straumÄ. KonkrÄts abonents var redzÄt tikai savu personÄ«go ziÅojumu vÄsturi.
Izmantojot komandu, varat abonÄt pavedienu un saÅemt jaunus ziÅojumus IZLASÄŖT. Tas ir nedaudz sarežģītÄk nekÄ XRANGE, tÄpÄc vispirms sÄksim ar vienkÄrÅ”Äkiem piemÄriem.
> 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"
IepriekÅ” minÄtajÄ piemÄrÄ ir parÄdÄ«ta nebloÄ·ÄjoÅ”a forma IZLASÄŖT. Å emiet vÄrÄ, ka opcija COUNT nav obligÄta. Faktiski vienÄ«gÄ nepiecieÅ”amÄ komandas opcija ir opcija STREAMS, kas norÄda straumju sarakstu kopÄ ar atbilstoÅ”o maksimÄlo identifikatoru. MÄs uzrakstÄ«jÄm "STREAMS mystream 0" - mÄs vÄlamies saÅemt visus mystream straumes ierakstus ar identifikatoru, kas ir lielÄks par "0-0". KÄ redzat piemÄrÄ, komanda atgriež pavediena nosaukumu, jo mÄs varam abonÄt vairÄkus pavedienus vienlaikus. MÄs varÄtu rakstÄ«t, piemÄram, "STREAMS mystream otherstream 0 0". LÅ«dzu, Åemiet vÄrÄ, ka pÄc opcijas STREAMS vispirms ir jÄnorÄda visu nepiecieÅ”amo straumju nosaukumi un tikai pÄc tam identifikatoru saraksts.
Å ajÄ vienkÄrÅ”ajÄ formÄ komanda nedara neko Ä«paÅ”u salÄ«dzinÄjumÄ ar XRANGE. TomÄr interesanti ir tas, ka mÄs varam viegli pagriezties IZLASÄŖT uz bloÄ·ÄÅ”anas komandu, norÄdot argumentu BLOĶÄT:
> XREAD BLOCK 0 STREAMS mystream $
IepriekÅ” minÄtajÄ piemÄrÄ jauna opcija BLOĶÄT ir norÄdÄ«ta ar taimautu 0 milisekundes (tas nozÄ«mÄ, ka jÄgaida bezgalÄ«gi). TurklÄt tÄ vietÄ, lai nodotu parasto straumes mystream identifikatoru, tika nodots Ä«paÅ”s identifikators $. Å is Ä«paÅ”ais identifikators to nozÄ«mÄ IZLASÄŖT kÄ identifikators ir jÄizmanto maksimÄlais mystream identifikators. TÄtad jaunus ziÅojumus saÅemsim tikai no brīža, kad sÄkÄm klausÄ«ties. Dažos veidos tas ir lÄ«dzÄ«gs Unix komandai "tail -f".
Å emiet vÄrÄ, ka, izmantojot opciju BLOĶÄT, mums nav obligÄti jÄizmanto Ä«paÅ”ais identifikators $. MÄs varam izmantot jebkuru straumÄ esoÅ”o identifikatoru. Ja komanda var nekavÄjoties apkalpot mÅ«su pieprasÄ«jumu bez bloÄ·ÄÅ”anas, tÄ to darÄ«s, pretÄjÄ gadÄ«jumÄ tÄ tiks bloÄ·Äta.
BloÄ·ÄÅ”ana IZLASÄŖT var arÄ« klausÄ«ties vairÄkus pavedienus vienlaikus, jums vienkÄrÅ”i jÄnorÄda to nosaukumi. Å ajÄ gadÄ«jumÄ komanda atgriezÄ«s pirmÄs straumes ierakstu, kas saÅÄma datus. Pirmais abonents, kas bloÄ·Äts konkrÄtajam pavedienam, vispirms saÅems datus.
PatÄrÄtÄju grupas
Dažos uzdevumos mÄs vÄlamies ierobežot abonentu piekļuvi ziÅojumiem vienÄ pavedienÄ. PiemÄrs, kur tas varÄtu bÅ«t noderÄ«gi, ir ziÅojumu rinda ar darbiniekiem, kuri saÅems dažÄdus ziÅojumus no pavediena, ļaujot ziÅojumu apstrÄdei palielinÄt mÄrogoÅ”anu.
Ja iedomÄjamies, ka mums ir trÄ«s abonenti C1, C2, C3 un pavediens, kas satur ziÅojumus 1, 2, 3, 4, 5, 6, 7, tad ziÅojumi tiks pasniegti, kÄ parÄdÄ«ts zemÄk esoÅ”ajÄ diagrammÄ:
1 -> C1
2 -> C2
3 -> C3
4 -> C1
5 -> C2
6 -> C3
7 -> C1
Lai sasniegtu Å”o efektu, Redis Stream izmanto koncepciju, ko sauc par Consumer Group. Å Ä« koncepcija ir lÄ«dzÄ«ga pseidoabonentam, kas saÅem datus no straumes, bet faktiski apkalpo vairÄki abonenti grupÄ, nodroÅ”inot noteiktas garantijas:
- Katrs ziÅojums tiek piegÄdÄts citam grupas abonentam.
- Grupas ietvaros abonenti tiek identificÄti pÄc viÅu vÄrda, kas ir reÄ£istrjutÄ«ga virkne. Ja abonents uz laiku izstÄjas no grupas, viÅu var atjaunot grupÄ, izmantojot viÅa unikÄlo nosaukumu.
- Katra patÄrÄtÄju grupa ievÄro āpirmÄ nelasÄ«tÄ ziÅojumaā koncepciju. Kad abonents pieprasa jaunus ziÅojumus, tas var saÅemt tikai tÄdas ziÅas, kuras nekad iepriekÅ” nav piegÄdÄtas nevienam grupas abonentam.
- Ir komanda, kas nepÄrprotami apstiprina, ka abonents ir veiksmÄ«gi apstrÄdÄjis ziÅojumu. KamÄr Ŕī komanda netiek izsaukta, pieprasÄ«tais ziÅojums paliks statusÄ "gaida".
- PatÄrÄtÄju grupÄ katrs abonents var pieprasÄ«t to ziÅojumu vÄsturi, kas viÅam tika piegÄdÄti, bet vÄl nav apstrÄdÄti (statusÄ āgaidaā).
SavÄ ziÅÄ grupas stÄvokli var izteikt Å”Ädi:
+----------------------------------------+
| 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)
+----------------------------------------+
Tagad ir pienÄcis laiks iepazÄ«ties ar galvenajÄm patÄrÄtÄju grupas komandÄm, proti:
- XGROUP izmanto, lai izveidotu, iznÄ«cinÄtu un pÄrvaldÄ«tu grupas
- XREADGROUP izmanto, lai lasītu straumi caur grupu
- XACK - Ŕī komanda ļauj abonentam atzÄ«mÄt ziÅojumu kÄ veiksmÄ«gi apstrÄdÄtu
PatÄrÄtÄju grupas izveide
PieÅemsim, ka mystream jau pastÄv. PÄc tam grupas izveides komanda izskatÄ«sies Å”Ädi:
> XGROUP CREATE mystream mygroup $
OK
Veidojot grupu, mums ir jÄnodod identifikators, no kura grupa saÅems ziÅojumus. Ja mÄs tikai vÄlamies saÅemt visus jaunos ziÅojumus, mÄs varam izmantot Ä«paÅ”o identifikatoru $ (kÄ mÅ«su piemÄrÄ iepriekÅ”). Ja Ä«paÅ”Ä identifikatora vietÄ norÄdÄt 0, visi pavedienÄ esoÅ”ie ziÅojumi bÅ«s pieejami grupai.
Tagad, kad grupa ir izveidota, mÄs varam nekavÄjoties sÄkt lasÄ«t ziÅojumus, izmantojot komandu XREADGROUP. Å Ä« komanda ir ļoti lÄ«dzÄ«ga IZLASÄŖT un atbalsta opciju BLOĶÄT. TomÄr ir obligÄta opcija GROUP, kas vienmÄr jÄnorÄda ar diviem argumentiem: grupas nosaukumu un abonenta vÄrdu. Tiek atbalstÄ«ta arÄ« opcija COUNT.
Pirms pavediena lasÄ«Å”anas ievietosim dažus ziÅojumus:
> 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
Tagad mÄÄ£inÄsim lasÄ«t Å”o straumi caur grupu:
> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
2) 1) 1) 1526569495631-0
2) 1) "message"
2) "apple"
IepriekÅ” minÄtÄ komanda burtiski skan Å”Ädi:
"Es, abonente Alise, manas grupas dalÄ«bniece, vÄlos izlasÄ«t vienu ziÅojumu no manas straumes, kas nekad iepriekÅ” nevienam nav piegÄdÄts."
Katru reizi, kad abonents veic darbÄ«bu grupÄ, tam ir jÄnorÄda savs nosaukums, unikÄli identificÄjot sevi grupÄ. IepriekÅ” minÄtajÄ komandÄ ir vÄl viena ļoti svarÄ«ga detaļa - Ä«paÅ”ais identifikators ">". Å is Ä«paÅ”ais identifikators filtrÄ ziÅojumus, atstÄjot tikai tos, kas nekad iepriekÅ” nav piegÄdÄti.
TÄpat Ä«paÅ”os gadÄ«jumos varat norÄdÄ«t reÄlu identifikatoru, piemÄram, 0 vai jebkuru citu derÄ«gu identifikatoru. Å ajÄ gadÄ«jumÄ komanda XREADGROUP atgriezÄ«s jums to ziÅojumu vÄsturi ar statusu "gaida", kas tika piegÄdÄti norÄdÄ«tajam abonentam (Alisei), bet vÄl nav apstiprinÄti, izmantojot komandu XACK.
MÄs varam pÄrbaudÄ«t Å”o darbÄ«bu, nekavÄjoties norÄdot ID 0, bez opcijas COUNT. MÄs vienkÄrÅ”i redzÄsim vienu neapstiprinÄtu ziÅojumu, tas ir, Apple ziÅojumu:
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) 1526569495631-0
2) 1) "message"
2) "apple"
TomÄr, ja mÄs apstiprinÄsim, ka ziÅojums ir veiksmÄ«gi apstrÄdÄts, tas vairs netiks rÄdÄ«ts:
> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
2) (empty list or set)
Tagad ir Boba kÄrta kaut ko lasÄ«t:
> 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"
Bobs, manas grupas dalÄ«bnieks, lÅ«dza ne vairÄk kÄ divas ziÅas. Komanda ziÅo tikai par nepiegÄdÄtajiem ziÅojumiem Ä«paÅ”Ä identifikatora ">" dÄļ. KÄ redzat, ziÅojums "Äbols" netiks parÄdÄ«ts, jo tas jau ir piegÄdÄts Alisei, tÄpÄc Bobs saÅem "apelsÄ«nu" un "zemeÅu".
TÄdÄ veidÄ Alise, Bobs un jebkurÅ” cits grupas abonents var lasÄ«t dažÄdus ziÅojumus no vienas straumes. ViÅi var arÄ« lasÄ«t savu neapstrÄdÄto ziÅojumu vÄsturi vai atzÄ«mÄt ziÅojumus kÄ apstrÄdÄtus.
Ir dažas lietas, kas jÄpatur prÄtÄ:
- TiklÄ«dz abonents uzskata ziÅojumu par komandu XREADGROUP, Å”is ziÅojums nonÄk stÄvoklÄ« āgaidaā un tiek pieŔķirts konkrÄtajam abonentam. Citi grupas abonenti nevarÄs izlasÄ«t Å”o ziÅojumu.
- Abonenti tiek automÄtiski izveidoti pÄc pirmÄs pieminÄÅ”anas, tie nav Ä«paÅ”i jÄizveido.
- Ar XREADGROUP JÅ«s varat lasÄ«t ziÅas no vairÄkiem dažÄdiem pavedieniem vienlaikus, taÄu, lai tas darbotos, vispirms ir jÄizveido grupas ar vienÄdu nosaukumu katram pavedienam, izmantojot XGROUP
AtveseļoÅ”anÄs pÄc neveiksmes
Abonents var atgÅ«ties no kļūmes un atkÄrtoti izlasÄ«t savu ziÅojumu sarakstu ar statusu āgaidaā. TomÄr reÄlajÄ pasaulÄ abonenti galu galÄ var neizdoties. Kas notiek ar abonenta iestrÄguÅ”ajiem ziÅojumiem, ja abonents nevar atgÅ«ties no neveiksmes?
Consumer Group piedÄvÄ iespÄju, kas tiek izmantota tieÅ”i tÄdiem gadÄ«jumiem ā kad jÄmaina ziÅu Ä«paÅ”nieks.
PirmÄ lieta, kas jums jÄdara, ir izsaukt komandu LÄŖDZEKÄ»I, kurÄ tiek parÄdÄ«ti visi grupas ziÅojumi ar statusu āgaidaā. VienkÄrÅ”ÄkajÄ formÄ komanda tiek izsaukta tikai ar diviem argumentiem: pavediena nosaukumu un grupas nosaukumu:
> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
2) "2"
Komanda parÄdÄ«ja neapstrÄdÄto ziÅojumu skaitu visai grupai un katram abonentam. Mums ir tikai Bobs ar diviem izciliem ziÅojumiem, jo āāvienÄ«gais ziÅojums, ko Alise pieprasÄ«ja, tika apstiprinÄts XACK.
MÄs varam pieprasÄ«t vairÄk informÄcijas, izmantojot vairÄk argumentu:
XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} ā identifikatoru diapazons (varat izmantot ā-ā un ā+ā)
{count} ā piegÄdes mÄÄ£inÄjumu skaits
{consumer-name} ā grupas nosaukums
> 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
Tagad mums ir informÄcija par katru ziÅojumu: ID, abonenta vÄrds, dÄ«kstÄves laiks milisekundÄs un visbeidzot piegÄdes mÄÄ£inÄjumu skaits. Mums ir divi ziÅojumi no Boba, un tie ir bijuÅ”i dÄ«kstÄvÄ 74170458 milisekundes, aptuveni 20 stundas.
LÅ«dzu, Åemiet vÄrÄ, ka neviens neliedz mums pÄrbaudÄ«t, kÄds bija ziÅojuma saturs, vienkÄrÅ”i izmantojot XRANGE.
> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
2) 1) "message"
2) "orange"
Mums tikai argumentos divreiz jÄatkÄrto viens un tas pats identifikators. Tagad, kad mums ir zinÄms priekÅ”stats, Alise varÄtu nolemt, ka pÄc 20 stundu dÄ«kstÄves Bobs, visticamÄk, neatgÅ«sies, un ir pienÄcis laiks vaicÄt Å”os ziÅojumus un atsÄkt to apstrÄdi Bobam. Å im nolÅ«kam mÄs izmantojam komandu XCLAIM:
XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}
Izmantojot Å”o komandu, mÄs varam saÅemt āÄrzemjuā ziÅojumu, kas vÄl nav apstrÄdÄts, mainot Ä«paÅ”nieku uz {consumer}. TomÄr mÄs varam nodroÅ”inÄt arÄ« minimÄlo dÄ«kstÄves laiku {min-idle-time}. Tas palÄ«dz izvairÄ«ties no situÄcijas, kad divi klienti mÄÄ£ina vienlaikus mainÄ«t vienu un to paÅ”u ziÅojumu Ä«paÅ”nieku:
Client 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Clinet 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0
Pirmais klients atiestatÄ«s dÄ«kstÄves laiku un palielinÄs piegÄdes skaitÄ«tÄju. TÄtad otrais klients nevarÄs to pieprasÄ«t.
> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
2) 1) "message"
2) "orange"
ZiÅojumu veiksmÄ«gi pieprasÄ«ja Alise, kura tagad var apstrÄdÄt ziÅojumu un to apstiprinÄt.
IepriekÅ” minÄtajÄ piemÄrÄ var redzÄt, ka veiksmÄ«gs pieprasÄ«jums atgriež paÅ”a ziÅojuma saturu. TomÄr tas nav nepiecieÅ”ams. Opciju JUSTID var izmantot, lai atgrieztu tikai ziÅojumu ID. Tas ir noderÄ«gi, ja jÅ«s neinteresÄ ziÅas informÄcija un vÄlaties palielinÄt sistÄmas veiktspÄju.
PiegÄdes skaitÄ«tÄjs
SkaitÄ«tÄjs, ko redzat izejÄ LÄŖDZEKÄ»I ir katra ziÅojuma piegÄdes reižu skaits. Å Äds skaitÄ«tÄjs tiek palielinÄts divos veidos: kad ziÅojums ir veiksmÄ«gi pieprasÄ«ts, izmantojot XCLAIM vai kad tiek izmantots zvans XREADGROUP.
Ir normÄli, ka daži ziÅojumi tiek piegÄdÄti vairÄkas reizes. Galvenais ir tas, ka visi ziÅojumi galu galÄ tiek apstrÄdÄti. Dažreiz, apstrÄdÄjot ziÅojumu, rodas problÄmas, jo pats ziÅojums ir bojÄts vai ziÅojuma apstrÄde izraisa kļūdu apstrÄdÄtÄja kodÄ. Å ajÄ gadÄ«jumÄ var izrÄdÄ«ties, ka neviens nevarÄs apstrÄdÄt Å”o ziÅojumu. TÄ kÄ mums ir piegÄdes mÄÄ£inÄjumu skaitÄ«tÄjs, mÄs varam izmantot Å”o skaitÄ«tÄju, lai noteiktu Å”Ädas situÄcijas. TÄpÄc, tiklÄ«dz piegÄdes skaits sasniedz jÅ«su norÄdÄ«to lielo skaitu, iespÄjams, bÅ«tu prÄtÄ«gÄk ievietot Å”Ädu ziÅojumu citÄ pavedienÄ un nosÅ«tÄ«t paziÅojumu sistÄmas administratoram.
VÄ«tnes stÄvoklis
Komanda XINFO izmanto, lai pieprasÄ«tu dažÄdu informÄciju par pavedienu un tÄ grupÄm. PiemÄram, pamata komanda izskatÄs Å”Ädi:
> 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"
IepriekÅ” esoÅ”Ä komanda parÄda vispÄrÄ«gu informÄciju par norÄdÄ«to straumi. Tagad nedaudz sarežģītÄks piemÄrs:
> 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
IepriekÅ” esoÅ”Ä komanda parÄda vispÄrÄ«gu informÄciju par visÄm norÄdÄ«tÄ pavediena grupÄm
> 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
IepriekÅ” esoÅ”Ä komanda parÄda informÄciju par visiem norÄdÄ«tÄs straumes un grupas abonentiem.
Ja esat aizmirsis komandas sintaksi, vienkÄrÅ”i lÅ«dziet palÄ«dzÄ«bu paÅ”ai komandai:
> 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.
Straumes lieluma ierobežojums
Daudzas lietojumprogrammas nevÄlas mūžīgi apkopot datus straumÄ. Bieži vien ir lietderÄ«gi iestatÄ«t maksimÄlo atļauto ziÅojumu skaitu vienÄ pavedienÄ. Citos gadÄ«jumos ir lietderÄ«gi pÄrvietot visus ziÅojumus no pavediena uz citu pastÄvÄ«go krÄtuvi, kad ir sasniegts norÄdÄ«tais pavediena lielums. Varat ierobežot straumes lielumu, izmantojot komandas parametru MAXLEN 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"
Lietojot MAXLEN, vecie ieraksti tiek automÄtiski dzÄsti, kad tie sasniedz noteiktu garumu, tÄpÄc straumei ir nemainÄ«gs izmÄrs. TomÄr atzaroÅ”ana Å”ajÄ gadÄ«jumÄ Redis atmiÅÄ nenotiek visefektÄ«vÄkajÄ veidÄ. JÅ«s varat uzlabot situÄciju Å”Ädi:
XADD mystream MAXLEN ~ 1000 * ... entry fields here ...
Arguments ~ iepriekÅ” minÄtajÄ piemÄrÄ nozÄ«mÄ, ka mums nav obligÄti jÄierobežo straumes garums lÄ«dz noteiktai vÄrtÄ«bai. MÅ«su piemÄrÄ tas varÄtu bÅ«t jebkurÅ” skaitlis, kas ir lielÄks par 1000 vai vienÄds ar to (piemÄram, 1000, 1010 vai 1030). MÄs tikko skaidri norÄdÄ«jÄm, ka vÄlamies, lai mÅ«su straumÄ bÅ«tu vismaz 1000 ierakstu. Tas padara atmiÅas pÄrvaldÄ«bu daudz efektÄ«vÄku Redis iekÅ”ienÄ.
Ir arī atseviŔķa komanda XTRIM, kas dara to paŔu:
> XTRIM mystream MAXLEN 10
> XTRIM mystream MAXLEN ~ 10
PastÄvÄ«ga glabÄÅ”ana un replikÄcija
Redis Stream tiek asinhroni replicÄts pakÄrtotajos mezglos un saglabÄts tÄdos failos kÄ AOF (visu datu momentuzÅÄmums) un RDB (visu rakstÄ«Å”anas darbÄ«bu žurnÄls). Tiek atbalstÄ«ta arÄ« patÄrÄtÄju grupu stÄvokļa replikÄcija. TÄpÄc, ja ziÅojuma statuss ir āgaidaā galvenajÄ mezglÄ, tad pakÄrtotajos mezglos Å”im ziÅojumam bÅ«s tÄds pats statuss.
AtseviŔķu elementu noÅemÅ”ana no straumes
Ir Ä«paÅ”a komanda ziÅojumu dzÄÅ”anai XDEL. Komanda iegÅ«st pavediena nosaukumu, kam seko dzÄÅ”amo ziÅojumu ID:
> 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"
Lietojot Å”o komandu, jÄÅem vÄrÄ, ka faktiskÄ atmiÅa netiks atbrÄ«vota uzreiz.
Nulles garuma straumes
AtŔķirÄ«ba starp straumÄm un citÄm Redis datu struktÅ«rÄm ir tÄda, ka tad, kad citÄs datu struktÅ«rÄs vairs nav elementu, kÄ blakusparÄdÄ«ba pati datu struktÅ«ra tiks noÅemta no atmiÅas. TÄtad, piemÄram, sakÄrtotÄ kopa tiks pilnÄ«bÄ noÅemta, kad ZREM izsaukums noÅems pÄdÄjo elementu. TÄ vietÄ pavedieniem ir atļauts palikt atmiÅÄ pat bez elementiem.
SecinÄjums
Redis Stream ir ideÄli piemÄrots ziÅojumu brokeru, ziÅojumu rindu, vienotas reÄ£istrÄÅ”anas un vÄstures saglabÄÅ”anas tÄrzÄÅ”anas sistÄmu izveidei.
KÄ jau reiz teicu
Avots: www.habr.com