Redis Stream - эътимоднокӣ ва миқёспазирии системаҳои паёмнависии шумо

Redis Stream - эътимоднокӣ ва миқёспазирии системаҳои паёмнависии шумо

Redis Stream як навъи нави абстрактии додаҳо мебошад, ки дар Redis бо версияи 5.0 муаррифӣ шудааст
Консептуалӣ, Redis Stream ин рӯйхатест, ки шумо метавонед ба он воридот илова кунед. Ҳар як вуруд дорои идентификатори беназир аст. Бо нобаёнӣ, ID ба таври худкор тавлид мешавад ва тамғаи вақтро дар бар мегирад. Аз ин рӯ, шумо метавонед бо мурури замон диапазони сабтҳоро пурсед ё ҳангоми ворид шудан ба ҷараён маълумоти нав гиред, ба мисли фармони Unix "tail -f" файли журналро мехонад ва ҳангоми интизории маълумоти нав ях мекунад. Аҳамият диҳед, ки муштариёни сершумор метавонанд риштаро дар як вақт гӯш кунанд, ҳамон тавре ки бисёре аз равандҳои "tail -f" метавонанд файлро дар як вақт бидуни ихтилоф бо ҳамдигар бихонанд.

Барои фаҳмидани ҳама бартариҳои навъи нави додаҳо, биёед ба сохторҳои деринаи Redis, ки функсияҳои Redis Stream-ро қисман такрор мекунанд, зуд аз назар гузаронем.

Redis PUB/SUB

Redis Pub/Sub як системаи оддии паёмнависӣ аст, ки аллакай дар мағозаи калидии шумо сохта шудааст. Бо вуҷуди ин, соддагӣ бо арзиши зерин меояд:

  • Агар ношир бо ягон сабаб ноком шавад, пас ӯ ҳамаи муштариёни худро аз даст медиҳад
  • Ношир бояд суроғаи дақиқи ҳамаи муштариёни худро донад
  • Ношир метавонад муштариёни худро аз ҳад зиёд кор кунад, агар маълумот нисбат ба коркард зудтар нашр шавад
  • Паём дарҳол пас аз нашр аз буфери ношир, новобаста аз он ки он ба чанд муштарӣ расонида шудааст ва то чӣ андоза онҳо тавонистаанд ин паёмро коркард кунанд, нест карда мешавад.
  • Ҳама муштариён дар як вақт паёмро мегиранд. Муштариён бояд бо кадом роҳе дар бораи тартиби коркарди ҳамон як паём мувофиқа кунанд.
  • Механизми дарунсохт барои тасдиқи он, ки муштарӣ паёмро бомуваффақият коркард кардааст, вуҷуд надорад. Агар муштарӣ паём гирад ва ҳангоми коркард ба кор дучор шавад, ношир дар ин бора хабар надорад.

Рӯйхати Redis

Рӯйхати Redis сохтори маълумотест, ки бастани фармонҳои хонданро дастгирӣ мекунад. Шумо метавонед паёмҳоро аз аввал ё охири рӯйхат илова ва хонед. Дар асоси ин сохтор, шумо метавонед барои системаи тақсимшудаи худ стек ё навбати хуб созед ва дар аксари ҳолатҳо ин кофӣ хоҳад буд. Фарқиятҳои асосӣ аз Redis Pub/Sub:

  • Паём ба як муштарӣ расонида мешавад. Аввалин мизоҷе, ки барои хондан баста шудааст, аввал маълумотро қабул мекунад.
  • Клинт бояд амалиёти хондани ҳар як паёмро худаш оғоз кунад. Рӯйхат дар бораи муштариён чизе намедонад.
  • Паёмҳо то он даме нигоҳ дошта мешаванд, ки касе онҳоро нахонад ё ба таври возеҳ нест кунад. Агар шумо сервери Redis-ро барои тоза кардани маълумот ба диск танзим кунед, он гоҳ эътимоднокии система ба таври назаррас меафзояд.

Муқаддима ба Stream

Илова кардани вуруд ба ҷараён

гурӯҳ XADD ба ҷараён як вуруди нав илова мекунад. Сабт танҳо сатр нест, он аз як ё якчанд ҷуфтҳои калид-арзиш иборат аст. Ҳамин тариқ, ҳар як вуруд аллакай сохтор карда шудааст ва ба сохтори файли CSV шабоҳат дорад.

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

Дар мисоли боло, мо ду майдонро ба ҷараён бо номи (калиди) "mystream" илова мекунем: "sensor-id" ва "ҳарорат" мутаносибан бо арзишҳои "1234" ва "19.8". Ҳамчун далели дуюм, фармон идентификатореро мегирад, ки ба вуруд таъин карда мешавад - ин идентификатор ҳар як вурудро дар ҷараён ба таври беназир муайян мекунад. Аммо, дар ин ҳолат мо * гузаштем, зеро мо мехоҳем Redis барои мо ID-и нав тавлид кунад. Ҳар як ID-и нав афзоиш хоҳад ёфт. Аз ин рӯ, ҳар як вуруди нав нисбат ба сабтҳои қаблӣ идентификатори баландтар хоҳад дошт.

Формати идентификатор

ID-и вуруд бо фармон баргардонида мешавад XADD, аз ду қисм иборат аст:

{millisecondsTime}-{sequenceNumber}

миллисония вақт - Вақти Unix бо миллисонияҳо (Вақти сервери Redis). Аммо, агар вақти ҷорӣ ба вақти сабти қаблӣ баробар ё камтар бошад, пас тамғаи сабти қаблӣ истифода мешавад. Аз ин рӯ, агар вақти сервер бо вақт баргардад, идентификатори нав моликияти афзоишро нигоҳ медорад.

Рақами пайдарпай барои сабтҳое, ки дар як миллисония сохта шудаанд, истифода мешавад. Рақами пайдарпай нисбат ба сабти қаблӣ 1 зиёд мешавад. Зеро ки Рақами пайдарпай андозааш 64 бит аст, пас дар амал шумо набояд ба маҳдудияти шумораи сабтҳое, ки дар давоми як миллисония тавлид мешаванд, дучор нашавед.

Формати чунин идентификаторҳо дар назари аввал аҷиб менамояд. Хонандаи нобовар метавонад ҳайрон шавад, ки чаро вақт як қисми муайянкунанда аст. Сабаб дар он аст, ки ҷараёнҳои Redis дархостҳои диапазонро аз рӯи ID дастгирӣ мекунанд. Азбаски идентификатор бо вақти эҷоди сабт алоқаманд аст, ин имкон медиҳад, ки диапазони вақтро пурсед. Вақте ки мо ба фармон нигаред, мо як мисоли мушаххасро дида мебароем XRANGE.

Агар бо ягон сабаб ба корбар лозим ояд, ки идентификатори худро муайян кунад, ки масалан, бо ягон системаи беруна алоқаманд аст, мо метавонем онро ба фармон гузаронем. XADD ба ҷои * тавре ки дар зер нишон дода шудааст:

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

Лутфан қайд кунед, ки дар ин ҳолат шумо бояд афзоиши ID-ро худатон назорат кунед. Дар мисоли мо, идентификатори минималӣ "0-1" аст, аз ин рӯ фармон идентификатори дигареро, ки ба "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

Шумораи сабтҳо дар як ҷараён

Бо истифода аз фармон шумораи сабтҳоро дар ҷараён гирифтан мумкин аст XLEN. Барои мисоли мо, ин фармон арзиши зеринро бармегардонад:

> XLEN somestream
(integer) 2

Дархостҳои диапазон - XRANGE ва XREVRANGE

Барои дархост кардани маълумот аз рӯи диапазон, мо бояд ду идентификаторро муайян кунем - ибтидо ва охири диапазон. Диапазони баргардонидашуда ҳама унсурҳоро, аз ҷумла сарҳадҳоро дар бар мегирад. Инчунин ду идентификатори махсуси "-" ва "+" мавҷуданд, ки мутаносибан хурдтарин (сабти аввал) ва калонтарин (сабти охирин) дар ҷараёнро доранд. Мисоли дар поён овардашуда ҳамаи сабтҳои ҷараёнро номбар мекунад.

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

Ҳар як сабти баргардонидашуда массиви ду элемент аст: идентификатор ва рӯйхати ҷуфтҳои калид-арзиш. Мо аллакай гуфта будем, ки идентификаторҳои сабт ба вақт алоқаманданд. Аз ин рӯ, мо метавонем як давраи муайяни вақтро дархост кунем. Аммо, мо метавонем дар дархост на идентификатори пурра, балки танҳо вақти Unix-ро, ки қисми марбут ба Рақами пайдарпай. Қисми партофташудаи идентификатор дар аввали диапазон ба таври худкор ба сифр ва дар охири диапазон ба ҳадди максималии имконпазир муқаррар карда мешавад. Дар зер намунаи он аст, ки чӣ тавр шумо метавонед диапазони ду миллисонияро дархост кунед.

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

Мо дар ин диапазон танҳо як вуруд дорем, аммо дар маҷмӯи додаҳои воқеӣ натиҷаи баргардонидашуда метавонад бузург бошад. Ба ин иллат XRANGE COUNT вариантро дастгирӣ мекунад. Бо муайян кардани миқдор, мо метавонем танҳо N сабти аввалинро ба даст орем. Агар ба мо лозим ояд, ки N сабти навбатиро (саҳифасозӣ) ба даст орем, мо метавонем ID-и охирини гирифташударо истифода барем, онро зиёд кунед Рақами пайдарпай якто ва боз пурсед. Биёед инро дар мисоли зерин дида бароем. Мо ба илова кардани 10 элемент бо XADD (фарз мекунем, ки mystream аллакай бо 10 элемент пур карда шудааст). Барои оғоз кардани такрори бо гирифтани 2 элемент дар як фармон, мо бо диапазони пурра оғоз мекунем, аммо бо COUNT баробар ба 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"

Барои идома додани такрори ду унсури навбатӣ, мо бояд ID-и охирини гирифташударо интихоб кунем, яъне 1519073279157-0 ва ба 1 илова кунед Рақами пайдарпай.
ID-и натиҷавӣ, дар ин ҳолат 1519073279157-1, акнун метавонад ҳамчун оғози нави далели диапазон барои занги навбатӣ истифода шавад 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"

Ва ғайра. Зеро мураккабӣ XRANGE аст O(log(N)) барои ҷустуҷӯ ва сипас O(M) барои баргардонидани элементҳои M, пас ҳар як қадами такрорӣ зуд аст. Ҳамин тариқ, истифода XRANGE ҷараёнҳоро самаранок такрор кардан мумкин аст.

гурӯҳ XREVRANGE баробар аст XRANGE, аммо элементҳоро бо тартиби баръакс бармегардонад:

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

Лутфан қайд кунед, ки фармон XREVRANGE далелҳои диапазонро бо тартиби баръакс оғоз ва қатъ мекунад.

Хондани сабтҳои нав бо истифода аз XREAD

Аксар вақт вазифа аз обуна шудан ба ҷараён ва гирифтани танҳо паёмҳои нав ба миён меояд. Ин консепсия метавонад ба Redis Pub/Sub ё бастани Redis Рӯйхати монанд ба назар расад, аммо дар тарзи истифодаи Redis Stream фарқиятҳои куллӣ мавҷуданд:

  1. Ҳар як паёми нав бо нобаёнӣ ба ҳар як муштарӣ расонида мешавад. Ин рафтор аз бастани Рӯйхати Redis фарқ мекунад, ки дар он паёми нав танҳо аз ҷониби як муштарӣ хонда мешавад.
  2. Ҳангоме ки дар Redis Pub/Sub ҳама паёмҳо фаромӯш карда мешаванд ва ҳеҷ гоҳ боқӣ намемонанд, дар Stream ҳама паёмҳо ба муддати номуайян нигоҳ дошта мешаванд (агар муштарӣ ба таври возеҳ боиси ҳазф нашавад).
  3. Redis Stream ба шумо имкон медиҳад, ки дастрасӣ ба паёмҳоро дар як ҷараён фарқ кунед. Муштарии мушаххас метавонад танҳо таърихи паёмҳои шахсии худро бубинад.

Шумо метавонед бо истифода аз фармон ба ришта обуна шавед ва паёмҳои нав гиред XREAD. Ин аз он каме мураккабтар аст XRANGE, бинобар ин мо аввал бо мисолҳои соддатар оғоз мекунем.

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

Намунаи дар боло овардашуда шакли блокнашавандаро нишон медиҳад XREAD. Дар хотир доред, ки имконоти COUNT ихтиёрӣ аст. Дарвоқеъ, ягона варианти фармони зарурӣ ин варианти STREAMS мебошад, ки рӯйхати ҷараёнҳоро дар баробари муайянкунандаи максималии мувофиқ муайян мекунад. Мо "STREAMS mystream 0" навиштем - мо мехоҳем ҳамаи сабтҳои ҷараёни mystream-ро бо идентификатори бузургтар аз "0-0" гирем. Тавре ки шумо аз мисол мебинед, фармон номи риштаро бармегардонад, зеро мо метавонем дар як вақт ба якчанд ришта обуна шавем. Мо метавонем, масалан, "STREAMS mystream otherstream 0 0" нависем. Лутфан таваҷҷӯҳ намоед, ки пас аз интихоби STREAMS мо бояд аввал номи ҳамаи ҷараёнҳои заруриро пешниҳод кунем ва танҳо баъд рӯйхати идентификаторҳоро пешниҳод кунем.

Дар ин шакли оддӣ фармон дар муқоиса бо ягон чизи махсусе намекунад XRANGE. Аммо, чизи ҷолиб он аст, ки мо метавонем ба осонӣ рӯй гардонем XREAD ба фармони блоккунӣ, бо нишон додани аргументи BLOCK:

> XREAD BLOCK 0 STREAMS mystream $

Дар мисоли дар боло овардашуда, варианти нави BLOCK бо вақти 0 миллисония муайян карда шудааст (ин маънои интизории номуайянро дорад). Ғайр аз он, ба ҷои гузариши идентификатори муқаррарии ҷараёни mystream, идентификатори махсуси $ гузаронида шуд. Ин идентификатори махсус маънои онро дорад XREAD бояд идентификатори максималиро дар mystream ҳамчун идентификатор истифода барад. Ҳамин тавр, мо танҳо аз лаҳзаи шунидан оғоз кардани паёмҳои нав мегирем. Дар баъзе ҷиҳатҳо ин ба фармони Unix "tail -f" монанд аст.

Дар хотир доред, ки ҳангоми истифодаи опсияи BLOCK ба мо ҳатман лозим нест, ки идентификатори махсуси $ -ро истифода барем. Мо метавонем ҳама гуна идентификатори дар ҷараён мавҷудбударо истифода барем. Агар даста ба дархости мо фавран бидуни блок хизмат расонида тавонад, ин корро мекунад, дар акси ҳол он баста мешавад.

Бастан XREAD инчунин метавонад дар як вақт якчанд риштаҳоро гӯш кунад, шумо танҳо бояд номҳои онҳоро муайян кунед. Дар ин ҳолат, фармон сабти ҷараёни аввалро, ки маълумот гирифта буд, бармегардонад. Аввалин муштарие, ки барои риштаи додашуда баста шудааст, аввал маълумот мегирад.

Гурӯҳҳои истеъмолкунандагон

Дар баъзе вазифаҳо, мо мехоҳем дастрасии муштариро ба паёмҳо дар як ришта маҳдуд кунем. Намунае, ки ин метавонад муфид бошад, як навбати паём бо коргарон аст, ки паёмҳои гуногунро аз ришта қабул мекунанд ва имкон медиҳанд, ки коркарди паёмҳо миқёси васеъ дошта бошанд.

Агар мо тасаввур кунем, ки мо се муштарии C1, C2, C3 ва риштае дорем, ки паёмҳои 1, 2, 3, 4, 5, 6, 7 доранд, пас паёмҳо дар диаграммаи зерин хидмат хоҳанд кард:

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

Барои ноил шудан ба ин таъсир, Redis Stream консепсияро бо номи Гурӯҳи истеъмолкунандагон истифода мебарад. Ин консепсия ба муштарии псевдо-муштарӣ монанд аст, ки маълумотро аз ҷараён мегирад, аммо дар асл аз ҷониби муштариёни сершумор дар дохили гурӯҳ хидмат мерасонад ва кафолатҳои муайян медиҳад:

  1. Ҳар як паём ба муштарии гуногуни дохили гурӯҳ расонида мешавад.
  2. Дар дохили гурӯҳ, муштариён аз рӯи номи худ муайян карда мешаванд, ки ин сатри ҳассос аст. Агар муштарӣ муваққатан аз гурӯҳ хориҷ шавад, вай метавонад бо истифода аз номи беназири худ ба гурӯҳ барқарор карда шавад.
  3. Ҳар як гурӯҳи истеъмолкунандагон ба консепсияи "паёми аввалини хонданашуда" пайравӣ мекунад. Вақте ки муштарӣ паёмҳои навро дархост мекунад, он метавонад танҳо паёмҳоеро қабул кунад, ки қаблан ба ягон муштарии дохили гурӯҳ расонида нашудаанд.
  4. Фармоне мавҷуд аст, ки ба таври возеҳ тасдиқ мекунад, ки паём аз ҷониби муштарӣ бомуваффақият коркард шудааст. То он даме, ки ин фармон даъват карда шавад, паёми дархостшуда дар ҳолати "интизори" боқӣ мемонад.
  5. Дар доираи Гурӯҳи истеъмолкунандагон, ҳар як муштарӣ метавонад таърихи паёмҳоеро, ки ба ӯ расонида шудаанд, вале то ҳол коркард нашудаанд (дар ҳолати "интизорӣ") дархост кунад.

Ба як маъно, ҳолати гурӯҳро метавон ба таври зерин ифода кард:

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

Ҳоло вақти он расидааст, ки бо фармонҳои асосӣ барои Гурӯҳи истеъмолкунандагон шинос шавем, аз ҷумла:

  • XGROUP барои эҷод, нест кардан ва идора кардани гурӯҳҳо истифода мешавад
  • XREADGROUP барои хондани ҷараён тавассути гурӯҳ истифода мешавад
  • XACK - ин фармон ба муштарӣ имкон медиҳад, ки паёмро ҳамчун бомуваффақият коркардшуда қайд кунад

Таъсиси гурӯҳи истеъмолкунандагон

Фарз мекунем, ки mystream аллакай вуҷуд дорад. Пас фармони ташкили гурӯҳ чунин хоҳад буд:

> XGROUP CREATE mystream mygroup $
OK

Ҳангоми таъсиси гурӯҳ, мо бояд идентификатореро гузаронем, ки аз он гурӯҳ паёмҳоро қабул мекунад. Агар мо танҳо хоҳем, ки ҳамаи паёмҳои навро қабул кунем, пас мо метавонем идентификатори махсуси $ -ро истифода барем (чун мисоли дар боло овардашуда). Агар шумо ба ҷои идентификатори махсус 0-ро таъин кунед, он гоҳ ҳама паёмҳои ришта барои гурӯҳ дастрас хоҳанд буд.

Ҳоло, ки гурӯҳ сохта шудааст, мо метавонем фавран бо истифода аз фармон ба хондани паёмҳо шурӯъ кунем XREADGROUP. Ин фармон ба хеле монанд аст XREAD ва опсияи ихтиёрии BLOCK -ро дастгирӣ мекунад. Аммо, варианти лозимии GROUP вуҷуд дорад, ки бояд ҳамеша бо ду далел нишон дода шавад: номи гурӯҳ ва номи муштарӣ. Опсияи COUNT низ дастгирӣ карда мешавад.

Пеш аз хондани ришта, биёед чанд паёмро дар он ҷо гузорем:

> 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

Акнун биёед кӯшиш кунем, ки ин ҷараёнро тавассути гурӯҳ хонем:

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

Фармони боло айнан чунин хонда мешавад:

"Ман, муштарӣ Алис, узви гурӯҳи ман, мехоҳам як паёмро аз mystream бихонам, ки то ҳол ба касе расонида нашудааст."

Ҳар дафъае, ки муштарӣ дар гурӯҳ амалеро анҷом медиҳад, вай бояд номи худро пешниҳод кунад, ки худро дар дохили гурӯҳ ба таври беназир муаррифӣ кунад. Дар фармони боло боз як ҷузъиёти хеле муҳим - идентификатори махсуси ">" мавҷуд аст. Ин идентификатори махсус паёмҳоро филтр мекунад ва танҳо паёмҳоеро боқӣ мегузорад, ки қаблан фиристода нашудаанд.

Инчунин, дар ҳолатҳои махсус, шумо метавонед идентификатори воқеиро, ба мисли 0 ё ягон идентификатори дигари дурустро муайян кунед. Дар ин ҳолат фармон XREADGROUP ба шумо таърихи паёмҳоро бо ҳолати "интизор" бармегардонад, ки ба муштарии зикршуда (Алис) расонида шуда буданд, аммо бо истифода аз фармон то ҳол тасдиқ карда нашудаанд. XACK.

Мо метавонем ин рафторро тавассути фавран муайян кардани ID 0 бидуни интихоб санҷем КОНИ. Мо танҳо як паёми интизорӣ, яъне паёми себро мебинем:

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

Аммо, агар мо паёмро бомуваффақият коркардшуда тасдиқ кунем, он дигар намоиш дода намешавад:

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

Акнун навбати Боб барои хондани чизе аст:

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

Боб, узви гурӯҳи mygroup, на бештар аз ду паём пурсид. Фармон танҳо дар бораи паёмҳои ирсолнашуда бо сабаби идентификатори махсуси ">" гузориш медиҳад. Тавре ки шумо мебинед, паёми "себ" намоиш дода намешавад, зеро он аллакай ба Алис расонида шудааст, бинобар ин Боб "апельсин" ва "Клубничка" мегирад.

Бо ин роҳ, Алис, Боб ва ҳар як муштарии дигари гурӯҳ метавонанд паёмҳои гуногунро аз як ҷараён бихонанд. Онҳо инчунин метавонанд таърихи паёмҳои коркарднашудаи худро хонанд ё паёмҳоро ҳамчун коркард қайд кунанд.

Якчанд чизҳое ҳастанд, ки бояд дар хотир дошта бошанд:

  • Хамин ки обуначй хабарро фармоне мешуморад XREADGROUP, ин паём ба ҳолати "интизори" мегузарад ва ба он муштарии мушаххас таъин карда мешавад. Дигар муштариёни гурӯҳ ин паёмро хонда наметавонанд.
  • Муштариён ҳангоми зикри аввал ба таври худкор эҷод мешаванд, ба таври возеҳ эҷод кардани онҳо лозим нест.
  • Бо кӯмаки XREADGROUP шумо метавонед паёмҳоро аз якчанд риштаҳои гуногун дар як вақт хонед, аммо барои ин кор шумо бояд аввал гурӯҳҳои дорои як ном барои ҳар як ришта бо истифода аз XGROUP

Барқароршавӣ пас аз нокомӣ

Муштарӣ метавонад аз нокомӣ барқарор шавад ва рӯйхати паёмҳои худро бо ҳолати "интизор" дубора хонад. Аммо, дар ҷаҳони воқеӣ, муштариён метавонанд дар ниҳоят ноком шаванд. Агар муштарӣ аз нокомӣ барқарор карда натавонад, бо паёмҳои дармондашудаи муштарӣ чӣ мешавад?
Гурӯҳи истеъмолкунандагон хусусиятеро пешниҳод мекунад, ки барои чунин ҳолатҳо истифода мешавад - вақте ки шумо бояд соҳиби паёмҳоро иваз кунед.

Аввалин чизе, ки ба шумо лозим аст, даъват кардани фармон аст XPENDING, ки ҳамаи паёмҳоро дар гурӯҳ бо ҳолати "интизор" нишон медиҳад. Дар шакли соддатарин фармон танҳо бо ду аргумент даъват карда мешавад: номи ришта ва номи гурӯҳ:

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

Даста шумораи паёмҳои коркарднашударо барои тамоми гурӯҳ ва ҳар як муштарӣ нишон дод. Мо танҳо Боб бо ду паёми барҷаста дорем, зеро ягона паёме, ки Алис дархост кардааст, тасдиқ карда шуд XACK.

Мо метавонем бо истифода аз далелҳои бештар маълумоти бештар талаб кунем:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - доираи идентификаторҳо (шумо метавонед "-" ва "+" -ро истифода баред)
{count} — шумораи кӯшишҳои интиқол
{Номи истеъмолкунанда} - номи гурӯҳ

> 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

Ҳоло мо барои ҳар як паём тафсилот дорем: ID, номи муштарӣ, вақти бекорӣ дар миллисонияҳо ва ниҳоят шумораи кӯшишҳои интиқол. Мо аз Боб ду паём дорем ва онҳо 74170458 миллисония, тақрибан 20 соат бекор буданд.

Лутфан қайд кунед, ки ҳеҷ кас моро аз тафтиш кардани мундариҷаи паём танҳо бо истифода аз он бозмедорад XRANGE.

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

Мо бояд танҳо як идентификаторро дар далелҳо ду маротиба такрор кунем. Ҳоло, ки мо каме андеша дорем, Алис метавонад қарор кунад, ки пас аз 20 соати бекорӣ, Боб эҳтимолан барқарор намешавад ва вақти он расидааст, ки ин паёмҳоро пурсед ва коркарди онҳоро барои Боб идома диҳед. Барои ин мо фармонро истифода мебарем XCLAIM:

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

Бо истифода аз ин фармон, мо метавонем паёми "хориҷӣ" -ро қабул кунем, ки бо иваз кардани соҳиби он ба {consumer} ҳанӯз коркард нашудааст. Аммо, мо инчунин метавонем ҳадди ақали вақти бекориро таъмин кунем {min-idle-time}. Ин барои пешгирӣ кардани вазъияте, ки ду муштарӣ кӯшиш мекунанд, ки соҳиби як паёмро иваз кунанд:

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

Мизоҷи аввал вақти бекориро барқарор мекунад ва ҳисобкунаки интиқолро зиёд мекунад. Ҳамин тавр, муштарии дуюм наметавонад онро дархост кунад.

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

Ин паём аз ҷониби Алис бомуваффақият даъво карда шуд, ки ҳоло метавонад паёмро коркард кунад ва онро эътироф кунад.

Аз мисоли боло, шумо мебинед, ки дархости муваффақ мундариҷаи паёмро бармегардонад. Бо вуҷуди ин, ин зарур нест. Опсияи JUSTID метавонад танҳо барои баргардонидани ID-ҳои паём истифода шавад. Ин муфид аст, агар шумо ба тафсилоти паём таваҷҷӯҳ надоред ва мехоҳед, ки кори системаро афзоиш диҳед.

Ҳисобкунаки интиқол

Ҳисобкунак, ки шумо дар баромад мебинед XPENDING шумораи интиқоли ҳар як паём аст. Чунин ҳисобкунак бо ду роҳ афзоиш меёбад: вақте ки паём тавассути бомуваффақият дархост карда мешавад XCLAIM ё вақте ки занг истифода мешавад XREADGROUP.

Якчанд маротиба фиристодани баъзе паёмҳо муқаррарӣ аст. Муҳим он аст, ки ҳама паёмҳо дар ниҳоят коркард мешаванд. Баъзан ҳангоми коркарди паём мушкилот ба вуҷуд меоянд, зеро худи паём вайрон шудааст ё коркарди паём боиси хатоги дар коди коркардкунанда мегардад. Дар ин ҳолат шояд маълум шавад, ки ҳеҷ кас наметавонад ин паёмро коркард кунад. Азбаски мо ҳисобкунаки кӯшиши интиқол дорем, мо метавонем ин ҳисобкунакро барои ошкор кардани чунин ҳолатҳо истифода барем. Аз ин рӯ, вақте ки шумораи интиқол ба рақами баланде, ки шумо нишон додед, мерасад, эҳтимол оқилонатар мебуд, ки чунин паёмро дар риштаи дигар ҷойгир кунед ва ба мудири система огоҳӣ фиристед.

Ҳолати ришта

гурӯҳ XINFO барои дархост кардани маълумоти гуногун дар бораи ришта ва гурӯҳҳои он истифода мешавад. Масалан, фармони асосӣ чунин менамояд:

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

Фармони боло маълумоти умумиро дар бораи ҷараёни муайяншуда нишон медиҳад. Акнун як мисоли каме мураккабтар:

> 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

Фармони боло маълумоти умумиро барои ҳамаи гурӯҳҳои риштаи муайяншуда нишон медиҳад

> 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

Фармони боло маълумотро барои ҳамаи муштариёни ҷараён ва гурӯҳи муайяншуда нишон медиҳад.
Агар шумо синтаксиси фармонро фаромӯш кунед, танҳо аз худи фармон кӯмак пурсед:

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

Маҳдудияти андозаи ҷараён

Бисёр барномаҳо намехоҳанд, ки маълумотро ба ҷараён то абад ҷамъ кунанд. Аксар вақт муфид аст, ки шумораи максималии паёмҳо дар як ришта иҷозат дода шавад. Дар ҳолатҳои дигар, ҳангоми расидан ба андозаи риштаи муқарраршуда интиқол додани ҳама паёмҳо аз ришта ба мағозаи дигари доимӣ муфид аст. Шумо метавонед андозаи ҷараёнро бо истифода аз параметри 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"

Ҳангоми истифодаи MAXLEN, сабтҳои кӯҳна ҳангоми расидан ба дарозии муайян ба таври худкор нест карда мешаванд, бинобар ин ҷараён андозаи доимӣ дорад. Аммо, навдаро дар ин ҳолат ба таври муассиртарин дар хотираи Redis ба амал намеояд. Шумо метавонед вазъиятро ба таври зерин беҳтар кунед:

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

Далели ~ дар мисоли боло маънои онро дорад, ки ба мо ҳатман лозим нест, ки дарозии ҷараёнро бо арзиши мушаххас маҳдуд кунем. Дар мисоли мо, ин метавонад ҳар як рақами бузургтар аз 1000 бошад (масалан, 1000, 1010 ё 1030). Мо танҳо ба таври возеҳ қайд кардем, ки мо мехоҳем ҷараёни мо ҳадди аққал 1000 сабтро нигоҳ дорад. Ин идоракунии хотираро дар дохили Redis хеле самараноктар мекунад.

Инчунин як дастаи алоҳида вуҷуд дорад XTRIM, ки ҳамон корро мекунад:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

Нигоҳдории доимӣ ва такрорӣ

Redis Stream ба таври асинхронӣ ба гиреҳҳои ғулом такрор карда мешавад ва дар файлҳо ба монанди AOF (тасвири ҳама маълумот) ва RDB (рӯзи ҳама амалиёти навиштан) захира карда мешавад. Репликатсияи ҳолати Гурӯҳҳои истеъмолкунандагон низ дастгирӣ карда мешавад. Аз ин рӯ, агар паём дар ҳолати "интизори" дар гиреҳи асосӣ бошад, пас дар гиреҳҳои ғуломӣ ин паём ҳамон ҳолат хоҳад дошт.

Хориҷ кардани унсурҳои алоҳида аз ҷараён

Фармони махсус барои нест кардани паёмҳо вуҷуд дорад XDEL. Фармон номи риштаро мегирад ва пас аз он 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"

Ҳангоми истифодаи ин фармон, шумо бояд ба назар гиред, ки хотираи воқеӣ фавран озод карда намешавад.

Ҷараёни дарозии сифр

Фарқи байни ҷараёнҳо ва дигар сохторҳои додаҳои Redis дар он аст, ки вақте дигар сохторҳои додаҳо дар дохили онҳо элемент надоранд, ҳамчун таъсири тараф, худи сохтори додаҳо аз хотира хориҷ карда мешавад. Ҳамин тавр, масалан, вақте ки занги ZREM элементи охиринро нест мекунад, маҷмӯи мураттабшуда пурра нест карда мешавад. Ба ҷои ин, риштаҳо иҷозат дода мешаванд, ки ҳатто бидуни ягон унсур дар дохили хотира боқӣ монанд.

хулоса

Redis Stream барои эҷоди брокерҳои паёмҳо, навбатҳои паёмҳо, сабти ягона ва системаҳои чатҳои таърихӣ беҳтарин аст.

Чунон ки боре гуфтам Никлаус Вирт, барномаҳо алгоритмҳо ва сохторҳои додаҳо мебошанд ва Redis аллакай ба шумо ҳарду медиҳад.

Манбаъ: will.com

Илова Эзоҳ