Redis Stream - kasaligan ug scalability sa imong mga sistema sa pagmemensahe

Redis Stream - kasaligan ug scalability sa imong mga sistema sa pagmemensahe

Ang Redis Stream usa ka bag-ong abstract data type nga gipaila sa Redis nga adunay bersyon 5.0
Sa konsepto, ang Redis Stream usa ka Lista diin mahimo nimong idugang ang mga entry. Ang matag entry adunay usa ka talagsaon nga identifier. Sa kasagaran, ang ID awtomatik nga namugna ug naglakip sa timestamp. Busa, mahimo kang mangutana sa mga han-ay sa mga rekord sa paglabay sa panahon, o makadawat og bag-ong datos sa pag-abot niini sa sapa, sama sa Unix nga "tail -f" nga sugo nga nagbasa og log file ug nag-freeze samtang naghulat sa bag-ong datos. Timan-i nga daghang mga kliyente ang makapamati sa usa ka hilo sa parehas nga oras, sama sa daghang mga proseso sa "tail -f" nga makabasa sa usa ka file nga dungan nga wala magkasumpaki sa usag usa.

Aron masabtan ang tanang benepisyo sa bag-ong tipo sa datos, atong tan-awon dayon ang dugay na nga mga istruktura sa Redis nga partially replicate sa functionality sa Redis Stream.

Redis PUB/SUB

Ang Redis Pub/Sub kay usa ka simple nga sistema sa pagmemensahe nga natukod na sa imong key-value store. Bisan pa, ang kayano moabut sa usa ka gasto:

  • Kung ang magmamantala sa usa ka hinungdan mapakyas, nan mawala ang tanan niyang mga subscriber
  • Kinahanglan mahibal-an sa magmamantala ang eksaktong adres sa tanan nga mga subscriber niini
  • Ang usa ka magmamantala mahimong mag-overload sa mga subscriber niini sa trabaho kung ang datos mamantala nga mas paspas kaysa kini maproseso
  • Ang mensahe mapapas gikan sa buffer sa magmamantala diha-diha dayon human sa publikasyon, bisan unsa pa kadaghan sa mga subscriber ang gihatod niini ug unsa ka paspas sila nakahimo sa pagproseso niini nga mensahe.
  • Ang tanan nga mga subscriber makadawat sa mensahe sa samang higayon. Ang mga subscriber sa ilang kaugalingon kinahanglan nga magkauyon sa ilang kaugalingon sa han-ay sa pagproseso sa parehas nga mensahe.
  • Walay built-in nga mekanismo aron makumpirma nga ang usa ka subscriber malampuson nga nagproseso sa usa ka mensahe. Kung ang usa ka suskritor nakadawat usa ka mensahe ug nahagsa sa panahon sa pagproseso, ang magmamantala dili mahibal-an bahin niini.

Listahan sa Redis

Ang Redis List usa ka istruktura sa datos nga nagsuporta sa pag-block sa mga command sa pagbasa. Mahimo nimong idugang ug basahon ang mga mensahe gikan sa sinugdanan o katapusan sa lista. Pinasukad sa kini nga istruktura, makahimo ka usa ka maayo nga stack o pila alang sa imong gipang-apod-apod nga sistema, ug sa kadaghanan nga mga kaso kini igo na. Panguna nga mga kalainan gikan sa Redis Pub/Sub:

  • Ang mensahe gihatag sa usa ka kliyente. Ang una nga gi-block nga kliyente makadawat una sa datos.
  • Kinahanglang sugdan ni Clint ang pagbasa sa operasyon sa matag mensahe mismo. Wala'y nahibal-an ang lista bahin sa mga kliyente.
  • Ang mga mensahe gitipigan hangtod nga adunay makabasa niini o klaro nga matangtang kini. Kung imong gi-configure ang Redis server aron ma-flush ang data sa disk, nan ang pagkakasaligan sa sistema modako pag-ayo.

Pasiuna sa Stream

Pagdugang og entry sa usa ka sapa

team XADD midugang og bag-ong entry sa sapa. Ang usa ka rekord dili lamang usa ka hilo, kini naglangkob sa usa o daghan pa nga mga parisan sa yawe nga kantidad. Busa, ang matag entry kay structured na ug susama sa structure sa usa ka CSV file.

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

Sa panig-ingnan sa ibabaw, gidugang namon ang duha ka mga uma sa sapa nga adunay ngalan (key) "mystream": "sensor-id" ug "temperatura" nga adunay mga kantidad nga "1234" ug "19.8", matag usa. Ingon nga ikaduha nga argumento, ang sugo nagkinahanglan og usa ka identifier nga i-assign sa entry - kini nga identifier talagsaon nga nagpaila sa matag entry sa sapa. Bisan pa, sa kini nga kaso gipasa namon ang * tungod kay gusto namon nga maghimo si Redis og bag-ong ID alang kanamo. Ang matag bag-ong ID modaghan. Busa, ang matag bag-ong entry adunay mas taas nga identifier kalabot sa nangaging mga entry.

Identifier nga porma

Ang entry ID gibalik pinaagi sa sugo XADD, naglangkob sa duha ka bahin:

{millisecondsTime}-{sequenceNumber}

millisecondsOras - Unix nga oras sa milliseconds (Redis server oras). Bisan pa, kung ang karon nga oras parehas o mas gamay kaysa sa oras sa miaging pagrekord, nan ang timestamp sa miaging pagrekord gigamit. Busa, kung ang oras sa server mobalik sa panahon, ang bag-ong identifier magpabilin gihapon sa pagdugang nga kabtangan.

sequenceNumber gigamit alang sa mga rekord nga gihimo sa parehas nga millisecond. sequenceNumber madugangan ug 1 ka paryente sa miaging entry. Tungod kay ang sequenceNumber mao ang 64 bits sa gidak-on, unya sa praktis kinahanglan nga dili modagan ngadto sa usa ka limitasyon sa gidaghanon sa mga rekord nga mahimo sa sulod sa usa ka millisecond.

Ang pormat sa maong mga identifier mahimong daw katingad-an sa unang pagtan-aw. Ang usa ka walay pagsalig nga magbabasa mahimong maghunahuna kung ngano nga ang oras bahin sa tigpaila. Ang hinungdan mao nga ang mga sapa sa Redis nagsuporta sa lainlaing mga pangutana pinaagi sa ID. Tungod kay ang identifier nalangkit sa panahon nga gibuhat ang rekord, kini nagpaposible sa pagpangutana sa mga han-ay sa oras. Atong tan-awon ang usa ka piho nga pananglitan kung atong tan-awon ang mando XRANGE.

Kung alang sa usa ka hinungdan ang user kinahanglan nga magtino sa iyang kaugalingon nga identifier, nga, pananglitan, nalangkit sa pipila nga eksternal nga sistema, nan mahimo naton kini ipasa sa mando. XADD imbes nga * sama sa gipakita sa ubos:

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

Palihug timan-i nga sa kini nga kaso kinahanglan nimo nga bantayan ang pagtaas sa ID sa imong kaugalingon. Sa among pananglitan, ang minimum nga identifier mao ang "0-1", mao nga ang command dili modawat sa laing identifier nga katumbas o ubos sa "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

Gidaghanon sa mga rekord matag sapa

Posible nga makuha ang gidaghanon sa mga rekord sa usa ka sapa pinaagi lamang sa paggamit sa mando XLEN. Alang sa among panig-ingnan, kini nga mando magbalik sa mosunod nga kantidad:

> XLEN somestream
(integer) 2

Mga pangutana sa range - XRANGE ug XREVRANGE

Sa paghangyo sa datos pinaagi sa range, kinahanglan natong ipiho ang duha ka identifier - ang sinugdanan ug ang katapusan sa range. Ang gibalik nga range maglakip sa tanan nga mga elemento, lakip ang mga utlanan. Adunay usab duha ka espesyal nga identifier nga "-" ug "+", matag usa nga nagpasabut nga labing gamay (unang rekord) ug labing dako (katapusan nga rekord) nga identifier sa sapa. Ang pananglitan sa ubos maglista sa tanan nga mga entry sa stream.

> 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"

Ang matag gibalik nga rekord usa ka han-ay sa duha ka mga elemento: usa ka identifier ug usa ka lista sa mga pares nga hinungdanon nga kantidad. Nakaingon na kami nga ang mga identifier sa rekord adunay kalabotan sa oras. Busa, kita makahangyo ug usa ka han-ay sa usa ka piho nga yugto sa panahon. Bisan pa, mahimo naton ipiho sa hangyo dili ang tibuuk nga identifier, apan ang oras sa Unix, nga wala’y kalabotan sa bahin sequenceNumber. Ang wala iapil nga bahin sa identifier awtomatik nga ibutang sa zero sa sinugdanan sa range ug sa pinakataas nga posible nga bili sa katapusan sa range. Sa ubos usa ka pananglitan kung giunsa nimo paghangyo ang usa ka sakup nga duha ka millisecond.

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

Naa ra kami usa ka entry sa kini nga range, bisan pa sa tinuud nga mga set sa datos ang resulta nga gibalik mahimong dako. Tungod niini nga hinungdan XRANGE nagsuporta sa COUNT nga kapilian. Pinaagi sa pagtino sa gidaghanon, makuha lang nato ang unang N nga mga rekord. Kung kinahanglan namon nga makuha ang sunod nga mga rekord sa N (pagination), magamit namon ang katapusan nga nadawat nga ID, dugangan kini sequenceNumber sa usa ug pangutana pag-usab. Atong tan-awon kini sa mosunod nga pananglitan. Nagsugod kami sa pagdugang sa 10 nga mga elemento nga adunay XADD (nagtuo nga ang mystream napuno na sa 10 ka elemento). Aron masugdan ang pag-uli nga makakuha og 2 nga mga elemento matag command, magsugod kita sa tibuok nga han-ay apan adunay COUNT nga katumbas sa 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"

Aron magpadayon sa pag-uli sa sunod nga duha ka elemento, kinahanglan natong pilion ang katapusang ID nga nadawat, ie 1519073279157-0, ug idugang ang 1 sa sequenceNumber.
Ang resulta nga ID, sa niini nga kaso 1519073279157-1, mahimo na nga gamiton isip bag-ong pagsugod sa range argumento alang sa sunod nga tawag 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"

Ug uban pa. Tungod kay komplikado XRANGE mao ang O(log(N)) aron pangitaon ug dayon O(M) aron ibalik ang M nga mga elemento, unya ang matag pag-uli nga lakang paspas. Busa, ang paggamit XRANGE ang mga sapa mahimong ma-uli nga episyente.

team XREVRANGE mao ang katumbas XRANGE, apan gibalik ang mga elemento sa reverse order:

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

Palihug timan-i nga ang sugo XREVRANGE nagkinahanglan sa range arguments magsugod ug mohunong sa reverse order.

Pagbasa sa bag-ong mga entry gamit ang XREAD

Kasagaran ang buluhaton motungha sa pag-subscribe sa usa ka sapa ug pagdawat lamang sa mga bag-ong mensahe. Kini nga konsepto mahimo’g susama sa Redis Pub/Sub o pag-block sa Redis List, apan adunay sukaranan nga mga kalainan kung giunsa ang paggamit sa Redis Stream:

  1. Ang matag bag-ong mensahe ipadala sa matag subscriber pinaagi sa default. Kini nga kinaiya lahi sa usa ka blocking Redis List, diin ang usa ka bag-ong mensahe basahon lamang sa usa ka subscriber.
  2. Samtang sa Redis Pub/Sub ang tanan nga mga mensahe nakalimtan ug wala gyud magpadayon, sa Stream ang tanan nga mga mensahe gipadayon hangtod sa hangtod (gawas kung ang kliyente klaro nga hinungdan sa pagtangtang).
  3. Gitugotan ka sa Redis Stream nga magkalainlain ang pag-access sa mga mensahe sa sulod sa usa ka sapa. Ang usa ka piho nga subscriber makakita lamang sa ilang personal nga kasaysayan sa mensahe.

Mahimo kang mag-subscribe sa usa ka thread ug makadawat og bag-ong mga mensahe gamit ang command XREAD. Kini usa ka gamay nga mas komplikado kaysa XRANGE, mao nga magsugod kita sa mas simple nga mga pananglitan una.

> 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"

Ang panig-ingnan sa ibabaw nagpakita sa usa ka non-blocking nga porma XREAD. Timan-i nga ang opsyon sa COUNT kay opsyonal. Sa tinuud, ang kinahanglan ra nga kapilian sa command mao ang kapilian sa STREAMS, nga nagtino sa usa ka lista sa mga sapa kauban ang katumbas nga labing kataas nga identifier. Gisulat namo ang "STREAMS mystream 0" - gusto namong madawat ang tanang rekord sa mystream stream nga adunay identifier nga labaw sa "0-0". Sama sa imong makita gikan sa panig-ingnan, ang mando nagbalik sa ngalan sa hilo tungod kay mahimo kaming mag-subscribe sa daghang mga hilo sa parehas nga oras. Mahimo natong isulat, pananglitan, ang "STREAMS mystream otherstream 0 0". Palihug timan-i nga human sa opsyon sa STREAMS kinahanglan una natong ihatag ang mga ngalan sa tanang gikinahanglang sapa ug dayon usa ka lista sa mga identifier.

Niining yano nga porma ang sugo wala magbuhat ug bisan unsa nga espesyal kumpara sa XRANGE. Apan, ang makaiikag nga butang mao nga kita dali nga moliko XREAD sa usa ka blocking command, nga nagtino sa BLOCK nga argumento:

> XREAD BLOCK 0 STREAMS mystream $

Sa pananglitan sa ibabaw, usa ka bag-ong BLOCK nga kapilian ang gitakda nga adunay timeout nga 0 milliseconds (nagpasabot kini nga paghulat nga walay katapusan). Dugang pa, imbes nga ipasa ang naandan nga identifier para sa stream mystream, usa ka espesyal nga identifier $ ang gipasa. Kining espesyal nga identifier nagpasabot niana XREAD kinahanglan gamiton ang maximum identifier sa mystream isip identifier. Mao nga makadawat ra kami mga bag-ong mensahe sugod sa pagsugod namon sa pagpaminaw. Sa pipila ka mga paagi kini susama sa Unix "tail -f" nga sugo.

Timan-i nga kung gamiton ang opsyon sa BLOCK dili kinahanglan nga gamiton ang espesyal nga identifier $. Mahimo natong gamiton ang bisan unsang identifier nga anaa sa sapa. Kung ang team makaserbisyo dayon sa among hangyo nga wala’y pag-block, buhaton kini, kung dili kini ma-block.

Pag-block XREAD mahimo usab nga maminaw sa daghang mga thread sa usa ka higayon, kinahanglan nimo nga ipiho ang ilang mga ngalan. Sa kini nga kaso, ang mando magbalik usa ka rekord sa una nga sapa nga nakadawat data. Ang una nga subscriber nga gibabagan alang sa usa ka gihatag nga thread makadawat una og datos.

Mga Grupo sa Konsyumer

Sa pipila ka mga buluhaton, gusto namong limitahan ang access sa subscriber sa mga mensahe sulod sa usa ka thread. Usa ka pananglitan kung diin kini mahimong mapuslanon mao ang usa ka pila nga mensahe sa mga trabahante nga makadawat lainlaing mga mensahe gikan sa usa ka hilo, nga gitugotan ang pagproseso sa mensahe nga masukod.

Kung atong mahanduraw nga kita adunay tulo ka mga subscriber C1, C2, C3 ug usa ka thread nga adunay mga mensahe 1, 2, 3, 4, 5, 6, 7, nan ang mga mensahe isilbi sama sa diagram sa ubos:

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

Aron makab-ot kini nga epekto, ang Redis Stream naggamit sa usa ka konsepto nga gitawag Consumer Group. Kini nga konsepto susama sa usa ka pseudo-subscriber, nga nakadawat og data gikan sa usa ka sapa, apan sa pagkatinuod giserbisyuhan sa daghang mga subscriber sulod sa usa ka grupo, nga naghatag ug piho nga mga garantiya:

  1. Ang matag mensahe ipadala ngadto sa lain-laing subscriber sulod sa grupo.
  2. Sulod sa usa ka grupo, ang mga subscriber giila sa ilang ngalan, nga usa ka case-sensitive nga string. Kung ang usa ka subscriber temporaryo nga mawala sa grupo, mahimo siyang ibalik sa grupo gamit ang iyang kaugalingon nga talagsaon nga ngalan.
  3. Ang matag Consumer Group nagsunod sa konsepto nga "unang wala pa mabasa nga mensahe". Kung ang usa ka suskritor nangayo ug bag-ong mga mensahe, makadawat ra kini nga mga mensahe nga wala pa nahatag kaniadto sa bisan kinsa nga suskritor sa sulod sa grupo.
  4. Adunay usa ka mando nga klaro nga kumpirmahon nga ang mensahe malampuson nga giproseso sa subscriber. Hangtud nga kini nga sugo gitawag, ang gihangyo nga mensahe magpabilin sa "pending" nga kahimtang.
  5. Sulod sa Consumer Group, ang matag subscriber mahimong makahangyo ug kasaysayan sa mga mensahe nga gihatag kaniya, apan wala pa maproseso (sa β€œpending” status)

Sa usa ka diwa, ang kahimtang sa grupo mahimong ipahayag ingon sa mosunod:

+----------------------------------------+
| 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)                             
+----------------------------------------+

Karon na ang panahon aron masinati ang mga nag-unang mga sugo alang sa Consumer Group, nga mao:

  • XGROUP gigamit sa paghimo, pagguba ug pagdumala sa mga grupo
  • XREADGROUP gigamit sa pagbasa sa stream pinaagi sa grupo
  • XACK - kini nga sugo nagtugot sa subscriber sa pagmarka sa mensahe nga malampuson nga naproseso

Pagmugna sa Consumer Group

Ibutang ta nga naglungtad na ang mystream. Unya ang command sa paghimo sa grupo mahimong tan-awon sama sa:

> XGROUP CREATE mystream mygroup $
OK

Kung maghimo usa ka grupo, kinahanglan namon nga ipasa ang usa ka identifier, sugod diin ang grupo makadawat mga mensahe. Kung gusto lang namo makadawat sa tanan nga bag-ong mga mensahe, nan mahimo namong gamiton ang espesyal nga identifier $ (sama sa among pananglitan sa ibabaw). Kung imong gipiho ang 0 imbes usa ka espesyal nga identifier, nan ang tanan nga mga mensahe sa hilo mahimong magamit sa grupo.

Karon nga nahimo na ang grupo, makasugod dayon kami sa pagbasa sa mga mensahe gamit ang command XREADGROUP. Kini nga sugo susama kaayo sa XREAD ug nagsuporta sa opsyonal nga BLOCK nga opsyon. Bisan pa, adunay gikinahanglan nga GROUP nga kapilian nga kinahanglan kanunay nga espesipiko sa duha ka argumento: ang ngalan sa grupo ug ang ngalan sa subscriber. Gisuportahan usab ang COUNT nga kapilian.

Sa dili pa basahon ang thread, ibutang nato ang pipila ka mga mensahe didto:

> 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

Karon atong sulayan nga basahon kini nga sapa pinaagi sa grupo:

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

Ang sugo sa ibabaw mabasa verbatim sama sa mosunod:

"Ako, ang subscriber nga si Alice, usa ka miyembro sa mygroup, gusto nga mobasa sa usa ka mensahe gikan sa akong stream nga wala pa mahatag bisan kinsa kaniadto."

Sa matag higayon nga ang usa ka subscriber mohimo og operasyon sa usa ka grupo, kini kinahanglan nga mohatag sa iyang ngalan, talagsaon nga pag-ila sa iyang kaugalingon sulod sa grupo. Adunay usa pa ka hinungdanon nga detalye sa sugo sa ibabaw - ang espesyal nga identifier ">". Kini nga espesyal nga identifier nagsala sa mga mensahe, nagbilin lamang sa mga wala pa mapadala kaniadto.

Usab, sa mga espesyal nga kaso, mahimo nimong itakda ang usa ka tinuod nga identifier sama sa 0 o bisan unsang ubang balido nga identifier. Sa kini nga kaso ang mando XREADGROUP ibalik kanimo ang usa ka kasaysayan sa mga mensahe nga adunay usa ka kahimtang nga "naghulat" nga gihatag sa piho nga suskritor (Alice) apan wala pa mailhi gamit ang mando XACK.

Mahimo natong sulayan kini nga kinaiya pinaagi sa pagtino dayon sa ID 0, nga walay kapilian COUNT. Makita ra namo ang usa ka pending nga mensahe, nga mao, ang mensahe sa mansanas:

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

Bisan pa, kung among kumpirmahon ang mensahe nga malampuson nga naproseso, nan dili na kini ipakita:

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

Karon turno na ni Bob sa pagbasa og usa ka butang:

> 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"

Si Bob, usa ka miyembro sa mygroup, nangayo og dili molapas sa duha ka mga mensahe. Ang mando nagreport lamang sa mga wala mahatag nga mensahe tungod sa espesyal nga identifier nga ">". Sama sa imong makita, ang mensahe nga "mansanas" dili ipakita tungod kay kini gihatud na kang Alice, mao nga si Bob nakadawat og "orange" ug "strawberry".

Niining paagiha, si Alice, Bob, ug bisan kinsa nga suskritor sa grupo makabasa sa lainlaing mga mensahe gikan sa parehas nga sapa. Mahimo usab nila mabasa ang ilang kasaysayan sa wala maproseso nga mga mensahe o markahan ang mga mensahe nga giproseso.

Adunay pipila ka mga butang nga hinumduman:

  • Sa diha nga ang subscriber giisip ang mensahe nga usa ka sugo XREADGROUP, kini nga mensahe moadto sa "pending" nga estado ug gi-assign sa maong piho nga subscriber. Ang ubang mga subscriber sa grupo dili makabasa niini nga mensahe.
  • Ang mga suskritor awtomatik nga gihimo sa una nga paghisgot, dili kinahanglan nga tin-aw nga paghimo kanila.
  • Uban sa tabang sa XREADGROUP Mahimo nimong basahon ang mga mensahe gikan sa daghang lain-laing mga thread sa samang higayon, bisan pa aron kini molihok kinahanglan nimo nga maghimo una og mga grupo nga adunay parehas nga ngalan alang sa matag thread gamit ang XGROUP

Pagkapakyas Pagbawi

Ang subscriber mahimong makabawi gikan sa kapakyasan ug magbasa pag-usab sa iyang listahan sa mga mensahe nga adunay "pending" nga status. Bisan pa, sa tinuud nga kalibutan, ang mga subscriber mahimong mapakyas sa katapusan. Unsa ang mahitabo sa usa ka subscriber's stuck messages kung ang subscriber dili makabawi gikan sa usa ka kapakyasan?
Ang Grupo sa Konsyumer nagtanyag usa ka bahin nga gigamit alang sa ingon nga mga kaso - kung kinahanglan nimo usbon ang tag-iya sa mga mensahe.

Ang una nga butang nga kinahanglan nimong buhaton mao ang pagtawag sa mando XPENDING, nga nagpakita sa tanang mensahe sa grupo nga adunay status nga β€œpending”. Sa pinakasimple nga porma niini, ang sugo gitawag nga adunay duha lang ka argumento: ang ngalan sa hilo ug ang ngalan sa grupo:

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

Gipakita sa team ang gidaghanon sa wala maproseso nga mga mensahe alang sa tibuok grupo ug alang sa matag subscriber. Naa ra namo si Bob nga adunay duha ka talagsaong mga mensahe tungod kay ang mensahe nga gihangyo ni Alice gikumpirma XACK.

Makapangayo kami og dugang nga impormasyon gamit ang dugang nga mga argumento:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - han-ay sa mga identifier (mahimo nimong gamiton ang "-" ug "+")
{count} β€” gidaghanon sa mga pagsulay sa paghatod
{consumer-name} - ngalan sa grupo

> 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

Karon kami adunay mga detalye alang sa matag mensahe: ID, ngalan sa suskritor, oras nga wala’y mahimo sa mga millisecond ug sa katapusan ang gidaghanon sa mga pagsulay sa pagpadala. Duna miy duha ka mensahe gikan kang Bob ug wala na silay trabaho sulod sa 74170458 milliseconds, mga 20 ka oras.

Palihug timan-i nga walay nagpugong kanamo sa pagsusi kon unsa ang sulod sa mensahe pinaagi lamang sa paggamit XRANGE.

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

Kinahanglan lang natong balikon ang parehas nga identifier kaduha sa mga argumento. Karon nga aduna na miy ideya, si Alice mahimong makahukom nga human sa 20 ka oras nga downtime, si Bob lagmit dili na maulian, ug panahon na nga mangutana niadtong mga mensahe ug ipadayon ang pagproseso niini para kang Bob. Alang niini gigamit namon ang mando XCLAIM:

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

Gamit kini nga sugo, makadawat kita ug "langyaw" nga mensahe nga wala pa maproseso pinaagi sa pag-ilis sa tag-iya ngadto sa {consumer}. Bisan pa, mahimo usab namon nga mahatagan ang labing gamay nga oras nga wala’y trabaho {min-idle-time}. Makatabang kini nga malikayan ang usa ka sitwasyon diin ang duha ka mga kliyente mosulay sa dungan nga pag-usab sa tag-iya sa parehas nga mga mensahe:

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

I-reset sa unang kustomer ang downtime ug dugangan ang delivery counter. Busa ang ikaduhang kliyente dili makapangayo niini.

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

Ang mensahe malampuson nga giangkon ni Alice, nga mahimo na karon nga magproseso sa mensahe ug moila niini.

Gikan sa pananglitan sa ibabaw, imong makita nga ang usa ka malampuson nga hangyo nagbalik sa mga sulud sa mensahe mismo. Apan, kini dili kinahanglan. Ang JUSTID nga kapilian mahimong gamiton sa pagbalik sa mga ID sa mensahe lamang. Kini mapuslanon kung dili ka interesado sa mga detalye sa mensahe ug gusto nga madugangan ang pasundayag sa sistema.

Delivery counter

Ang counter nga imong makita sa output XPENDING mao ang gidaghanon sa mga paghatod sa matag mensahe. Ang ingon nga usa ka counter gidugangan sa duha ka paagi: kung ang usa ka mensahe malampuson nga gihangyo pinaagi sa XCLAIM o kung ang usa ka tawag gigamit XREADGROUP.

Normal lang sa pipila ka mga mensahe nga ipadala sa makadaghang higayon. Ang nag-unang butang mao nga ang tanan nga mga mensahe sa katapusan giproseso. Usahay mahitabo ang mga problema sa pagproseso sa usa ka mensahe tungod kay ang mensahe mismo nadaot, o ang pagproseso sa mensahe hinungdan sa usa ka sayup sa handler code. Sa kini nga kaso, mahimo’g mogawas nga wala’y makaproseso sa kini nga mensahe. Tungod kay kami adunay counter sa pagsulay sa pagpadala, magamit namon kini nga counter aron mahibal-an ang ingon nga mga sitwasyon. Busa, sa higayon nga ang ihap sa pagpadala makaabot sa taas nga numero nga imong gitakda, mas maalamon nga ibutang ang ingon nga mensahe sa laing thread ug magpadala usa ka pahibalo ngadto sa tagdumala sa sistema.

Thread State

team XINFO gigamit sa paghangyo sa lainlaing impormasyon bahin sa usa ka hilo ug sa mga grupo niini. Pananglitan, ang usa ka sukaranan nga mando ingon niini:

> 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"

Ang sugo sa ibabaw nagpakita sa kinatibuk-ang impormasyon mahitungod sa gipiho nga sapa. Karon usa ka gamay nga mas komplikado nga pananglitan:

> 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

Ang sugo sa ibabaw nagpakita sa kinatibuk-ang impormasyon para sa tanang grupo sa gipiho nga hilo

> 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

Ang sugo sa ibabaw nagpakita sa impormasyon para sa tanang subscriber sa espesipikong sapa ug grupo.
Kung nakalimtan nimo ang command syntax, pangutan-a lang ang command mismo alang sa tabang:

> 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.

Limitado sa Gidak-on sa Stream

Daghang mga aplikasyon ang dili gusto nga mangolekta og data sa usa ka sapa hangtod sa hangtod. Kanunay nga mapuslanon nga adunay labing kadaghan nga mga mensahe nga gitugotan matag thread. Sa ubang mga kaso, mapuslanon ang pagbalhin sa tanan nga mga mensahe gikan sa usa ka hilo ngadto sa lain nga nagpadayon nga tindahan kung ang gitakda nga gidak-on sa hilo maabot. Mahimo nimong limitahan ang gidak-on sa usa ka sapa gamit ang MAXLEN parameter sa command 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"

Kung gigamit ang MAXLEN, ang daan nga mga rekord awtomatik nga mapapas kung kini moabut sa usa ka piho nga gitas-on, mao nga ang sapa adunay kanunay nga gidak-on. Bisan pa, ang pagpul-ong sa kini nga kaso dili mahitabo sa labing episyente nga paagi sa memorya sa Redis. Mahimo nimong pauswagon ang kahimtang sama sa mosunod:

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

Ang ~ argumento sa panig-ingnan sa ibabaw nagpasabut nga dili kinahanglan nga limitahan ang gitas-on sa sapa sa usa ka piho nga kantidad. Sa among pananglitan, kini mahimong bisan unsang numero nga mas dako o katumbas sa 1000 (pananglitan, 1000, 1010, o 1030). Giklaro lang namo nga gusto namo nga ang among stream magtipig ug labing menos 1000 ka mga rekord. Kini naghimo sa pagdumala sa memorya nga mas episyente sa sulod sa Redis.

Adunay usab usa ka lahi nga team XTRIM, nga nagbuhat sa samang butang:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

Nagpadayon nga pagtipig ug pagkopya

Ang Redis Stream asynchronously gisundog sa mga node sa ulipon ug gitipigan sa mga file sama sa AOF (snapshot sa tanan nga datos) ug RDB (log sa tanan nga mga operasyon sa pagsulat). Ang replikasyon sa estado sa Consumer Groups gisuportahan usab. Busa, kung ang usa ka mensahe anaa sa "pending" nga status sa master node, nan sa mga slave node kini nga mensahe adunay parehas nga status.

Pagtangtang sa indibidwal nga mga elemento gikan sa usa ka sapa

Adunay usa ka espesyal nga sugo sa pagtangtang sa mga mensahe XDEL. Gikuha sa sugo ang ngalan sa hilo nga gisundan sa mga ID sa mensahe nga tangtangon:

> 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"

Kung gigamit kini nga mando, kinahanglan nimo nga tagdon nga ang tinuud nga panumduman dili dayon ipagawas.

Zero ang gitas-on nga mga sapa

Ang kalainan tali sa mga sapa ug uban pang mga istruktura sa datos sa Redis mao nga kung ang ubang mga istruktura sa datos wala nay mga elemento sa sulod niini, ingon usa ka epekto, ang istruktura sa datos mismo makuha gikan sa panumduman. Busa, pananglitan, ang gihan-ay nga set hingpit nga matangtang kung ang tawag sa ZREM magtangtang sa katapusang elemento. Hinuon, gitugotan ang mga hilo nga magpabilin sa memorya bisan kung wala’y bisan unsang elemento sa sulod.

konklusyon

Ang Redis Stream maayo alang sa paghimo sa mga broker sa mensahe, mga pila sa mensahe, hiniusa nga pag-log, ug mga sistema sa chat nga nagtipig sa kasaysayan.

Sama sa akong giingon kaniadto Niklaus Wirth, ang mga programa kay mga algorithm ug mga istruktura sa datos, ug ang Redis naghatag na kanimo sa duha.

Source: www.habr.com

Idugang sa usa ka comment