Redis Stream - reliabiliti sareng skalabilitas sistem olahtalatah anjeun

Redis Stream - reliabiliti sareng skalabilitas sistem olahtalatah anjeun

Redis Stream mangrupakeun tipe data abstrak anyar diwanohkeun dina Redis kalawan versi 5.0
Sacara konsép, Redis Stream mangrupikeun Daptar anu anjeun tiasa nambihan éntri. Unggal éntri gaduh identifier unik. Sacara standar, ID otomatis dihasilkeun sarta ngawengku timestamp a. Ku alatan éta, anjeun tiasa naroskeun rentang rékaman dina waktosna, atanapi nampi data énggal nalika sumping dina aliran, sapertos paréntah Unix "buntut -f" maca file log sareng beku bari ngantosan data énggal. Catet yén sababaraha klien tiasa ngadangukeun thread dina waktos anu sami, sapertos seueur prosés "buntut -f" tiasa maca file sakaligus tanpa saling bertentangan.

Pikeun ngartos sagala kauntungan tina tipe data anyar, hayu urang nyandak katingal gancang dina struktur Redis lila-aya anu sawaréh ngayakeun réplikasi fungsionalitas Redis Stream.

Redis PUB / SUB

Redis Pub / Sub mangrupikeun sistem olahtalatah saderhana anu parantos diwangun kana toko nilai konci anjeun. Sanajan kitu, kesederhanaan datang dina biaya:

  • Mun penerbit pikeun sababaraha alesan gagal, anjeunna leungiteun sakabéh palanggan-Na
  • Penerbit kedah terang alamat pasti sadaya palangganna
  • Penerbit tiasa ngabeungbeuratan palangganna ku padamelan upami data diterbitkeun langkung gancang tibatan diolah
  • Suratna dihapus tina panyangga penerbit langsung saatos publikasi, henteu paduli sabaraha palanggan anu dikirimkeun sareng kumaha gancangna aranjeunna tiasa ngolah pesen ieu.
  • Sadaya palanggan bakal nampi pesen dina waktos anu sami. Palanggan sorangan kedah kumaha waé satuju diantara aranjeunna dina urutan ngolah pesen anu sami.
  • Henteu aya mékanisme anu diwangun pikeun mastikeun yén palanggan parantos suksés ngolah pesen. Upami palanggan nampi pesen sareng ngadat nalika ngolah, penerbit moal terang ngeunaan éta.

Daptar Redis

Daptar Redis mangrupikeun struktur data anu ngadukung blokir paréntah dibaca. Anjeun tiasa nambahkeun jeung maca talatah ti mimiti atawa ahir daptar. Dumasar struktur ieu, anjeun tiasa ngadamel tumpukan alus atawa antrian pikeun sistem disebarkeun Anjeun, sarta di hal nu ilahar ieu bakal cukup. Beda utama ti Redis Pub/Sub:

  • Suratna dikirimkeun ka hiji klien. Klién anu dipeungpeuk dibaca munggaran bakal nampi data heula.
  • Clint kedah ngamimitian operasi maca pikeun tiap pesen nyalira. Daptar teu terang nanaon ngeunaan klien.
  • Talatah disimpen nepi ka aya nu maca atawa ngahapus sacara eksplisit. Upami anjeun ngonpigurasikeun server Redis pikeun nyiram data kana disk, maka réliabilitas sistem naék sacara dramatis.

Bubuka pikeun Stream

Nambahkeun éntri kana aliran

regu XADD nambihan éntri anyar kana aliran. Rékor sanés ngan ukur string, éta diwangun ku hiji atanapi langkung pasangan konci-nilai. Janten, unggal éntri parantos terstruktur sareng nyarupaan struktur file CSV.

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

Dina conto di luhur, urang tambahkeun dua widang kana aliran kalawan nami (konci) "mystream": "sensor-id" jeung "suhu" kalawan nilai "1234" jeung "19.8", mungguh. Salaku argumen kadua, paréntah nyokot identifier anu bakal ditugaskeun ka entri - identifier ieu uniquely ngaidentipikasi unggal entri dina aliran. Nanging, dina hal ieu kami lulus * sabab kami hoyong Redis ngahasilkeun ID énggal pikeun kami. Unggal ID anyar bakal ningkat. Ku alatan éta, unggal entri anyar bakal boga identifier luhur dina hubungan entri saméméhna.

Format idéntifikasi

ID éntri dipulangkeun ku paréntah XADD, diwangun ku dua bagian:

{millisecondsTime}-{sequenceNumber}

milidetikWaktos - Waktu Unix dina milliseconds (waktos server Redis). Nanging, upami waktos ayeuna sami atanapi kirang ti waktos rekaman sateuacana, maka stempel waktos rekaman sateuacana dianggo. Ku alatan éta, lamun waktu server balik dina jangka waktu nu, identifier anyar masih bakal nahan sipat increment.

sequenceNumber dipaké pikeun rékaman dijieun dina millidetik sarua. sequenceNumber bakal ngaronjat ku 1 relatif ka entri saméméhna. Kusabab éta sequenceNumber nyaeta 64 bit dina ukuran, lajeng dina prakna anjeun teu kudu ngajalankeun kana wates dina Jumlah rékaman nu bisa dihasilkeun dina hiji milidetik.

The format identifiers misalna bisa sigana aneh di glance kahiji. Pamaca anu teu percanten tiasa heran naha waktos mangrupikeun bagian tina identifier. Alesanna nyaéta yén aliran Redis ngadukung query rentang ku ID. Kusabab identifier pakait sareng waktos rékaman dijieun, ieu ngamungkinkeun pikeun query rentang waktu. Kami bakal ningali conto khusus nalika ningali paréntahna XRANGE.

Lamun pikeun sababaraha alesan pamaké kudu nangtukeun identifier sorangan, nu, contona, pakait sareng sababaraha sistem éksternal, lajeng urang bisa ngirimkeunana kana paréntah. XADD tinimbang * sakumaha ditémbongkeun di handap ieu:

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

Punten dicatet yén dina hal ieu anjeun kedah ngawas paningkatan KTP sorangan. Dina conto urang, identifier minimum nyaeta "0-1", jadi paréntah moal nampa identifier sejen anu sarua atawa kirang ti "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

Jumlah rékaman per stream

Kasebut nyaéta dimungkinkeun pikeun kéngingkeun jumlah rékaman dina aliran ngan ukur nganggo paréntah XLEN. Pikeun conto urang, paréntah ieu bakal mulangkeun nilai ieu:

> XLEN somestream
(integer) 2

Rentang queries - XRANGE na XREVRANGE

Pikeun ménta data ku rentang, urang kudu nangtukeun dua identifiers - awal jeung ahir rentang. Kisaran anu dipulangkeun bakal kalebet sadaya unsur, kalebet wates. Aya ogé dua identifier husus "-" jeung "+", masing-masing hartina pangleutikna (catetan kahiji) jeung pangbadagna (catetan panungtungan) identifier dina aliran. Conto di handap bakal daptar sadaya éntri aliran.

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

Unggal catetan anu dipulangkeun mangrupikeun susunan dua elemen: identifier sareng daptar pasangan konci-nilai. Kami parantos nyarios yén idéntifikasi catetan aya hubunganana sareng waktos. Ku alatan éta, urang bisa ménta sauntuyan kurun waktu nu tangtu. Najan kitu, urang bisa nangtukeun dina pamundut teu identifier pinuh, tapi ngan waktu Unix, omitting bagian nu patali jeung sequenceNumber. Bagian anu dileungitkeun tina identifier bakal otomatis disetel ka nol di awal rentang jeung ka nilai maksimum mungkin dina tungtung rentang. Di handap ieu conto kumaha anjeun tiasa menta rentang dua milliseconds.

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

Kami ngan ukur gaduh hiji éntri dina kisaran ieu, tapi dina set data nyata hasil anu dipulangkeun tiasa ageung. Kusabab ieu XRANGE ngarojong pilihan COUNT. Ku nangtukeun kuantitas, urang ngan saukur bisa meunangkeun N rékaman munggaran. Lamun urang kudu meunang rékaman N salajengna (pagination), urang tiasa nganggo ID panungtungan narima, ningkatkeun deui sequenceNumber ku saurang-saurang nanya deui. Hayu urang tingali ieu dina conto di handap ieu. Urang mimitian nambahkeun 10 elemen kalawan XADD (asumsina mystream ieu geus ngeusi 10 elemen). Pikeun ngamimitian iterasi meunang 2 elemen per paréntah, urang mimitian ku rentang pinuh tapi kalawan COUNT sarua jeung 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"

Pikeun neraskeun iterasi sareng dua elemen salajengna, urang kedah milih ID anu terakhir nampi, nyaéta 1519073279157-0, sareng tambahkeun 1 ka sequenceNumber.
ID anu dihasilkeun, dina hal ieu 1519073279157-1, ayeuna tiasa dianggo salaku awal argumen rentang anyar pikeun sauran salajengna 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"

Teras salajengna. Kusabab pajeulitna XRANGE nyaeta O (log (N)) neangan lajeng O (M) balik elemen M, lajeng unggal hambalan Iteration téh gancang. Ku kituna, ngagunakeun XRANGE stream bisa iterated éfisién.

regu XREVRANGE nyaeta sarimbag XRANGE, tapi mulihkeun elemen dina urutan sabalikna:

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

Perhatikeun yén paréntah XREVRANGE nyokot rentang argumen dimimitian jeung eureun dina urutan sabalikna.

Maca éntri énggal nganggo XREAD

Seringna tugas timbul pikeun ngalanggan aliran sareng ngan ukur nampi pesen anyar. Konsep ieu sigana mirip sareng Redis Pub/Sub atanapi ngablokir Daptar Redis, tapi aya bédana dasar dina cara ngagunakeun Redis Stream:

  1. Unggal pesen anyar dikirimkeun ka unggal palanggan sacara standar. Paripolah ieu béda ti Daptar Redis anu ngahalangan, dimana pesen anyar ngan bakal dibaca ku hiji palanggan.
  2. Nalika di Redis Pub/Sub sadaya pesen dipohokeun sareng henteu kantos diteruskeun, dina Aliran sadaya pesen dipikagaduh salamina (kecuali klien sacara eksplisit nyababkeun ngahapus).
  3. Redis Stream ngamungkinkeun anjeun ngabédakeun aksés kana pesen dina hiji aliran. Palanggan khusus ngan ukur tiasa ningali sajarah pesen pribadina.

Anjeun tiasa ngalanggan thread sareng nampi pesen anyar nganggo paréntah XBACA. Ieu saeutik leuwih pajeulit batan XRANGE, janten urang mimitian ku conto anu langkung sederhana heula.

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

Conto di luhur nembongkeun formulir non-blocking XBACA. Catet yén pilihan COUNT nyaéta opsional. Nyatana, hiji-hijina pilihan paréntah anu diperyogikeun nyaéta pilihan STREAMS, anu netepkeun daptar aliran sareng idéntifikasi maksimum anu cocog. Kami nyerat "STREAMS mystream 0" - kami hoyong nampi sadaya rékaman aliran mystream kalayan idéntifikasi langkung ageung tibatan "0-0". Sakumaha anjeun tiasa tingali tina conto, paréntah ngabalikeun nami benang sabab urang tiasa ngalanggan sababaraha benang dina waktos anu sami. Urang tiasa nyerat, contona, "STREAMS mystream otherstream 0 0". Punten perhatikeun yén saatos pilihan STREAMS urang kedah nyayogikeun heula nami sadaya aliran anu diperyogikeun teras ngan ukur daptar idéntifikasi.

Dina formulir basajan ieu paréntah teu ngalakukeun nanaon husus dibandingkeun jeung XRANGE. Sanajan kitu, hal metot nyaeta urang bisa kalayan gampang ngahurungkeun XBACA kana paréntah blocking, nangtukeun argumen BLOCK:

> XREAD BLOCK 0 STREAMS mystream $

Dina conto di luhur, hiji pilihan BLOCK anyar dieusian ku timeout 0 milliseconds (ieu hartina ngantosan salamina). Leuwih ti éta, tinimbang ngalirkeun identifier dawam pikeun stream mystream, a identifier husus $ diliwatan. identifier husus Ieu ngandung harti yén XBACA kedah nganggo identifier maksimum dina mystream salaku identifier. Janten urang ngan bakal nampi pesen anyar ti mimiti ngupingkeun. Dina sababaraha cara ieu sami sareng paréntah Unix "buntut -f".

Catet yén nalika nganggo pilihan BLOCK kami henteu kedah nganggo identifier khusus $. Urang tiasa nganggo identifier naon waé anu aya dina aliran. Upami tim tiasa ngalayanan pamundut urang langsung tanpa ngahalangan, éta bakal ngalakukeunana, upami henteu bakal meungpeuk.

Meungpeung XBACA ogé bisa ngadéngékeun sababaraha threads sakaligus, Anjeun ngan perlu nangtukeun ngaran maranéhanana. Dina hal ieu, paréntah bakal ngabalikeun rékaman tina aliran munggaran anu nampi data. Palanggan munggaran anu diblokir pikeun utas anu dipasihkeun bakal nampi data heula.

Grup Konsumén

Dina tugas-tugas anu tangtu, urang hoyong ngawatesan aksés palanggan kana pesen dina hiji utas. Conto dimana ieu tiasa mangpaat nyaéta antrian pesen sareng pagawé anu bakal nampi pesen anu béda tina benang, ngamungkinkeun pamrosésan pesen skala.

Upami urang ngabayangkeun yén urang gaduh tilu palanggan C1, C2, C3 sareng benang anu ngandung pesen 1, 2, 3, 4, 5, 6, 7, teras pesen bakal dilayanan sapertos dina diagram di handap ieu:

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

Pikeun ngahontal éfék ieu, Redis Stream ngagunakeun konsép anu disebut Consumer Group. Konsep ieu sarupa jeung pseudo-palanggan, nu narima data ti stream, tapi sabenerna dilayanan ku sababaraha palanggan dina grup, nyadiakeun jaminan tangtu:

  1. Unggal pesen dikirimkeun ka palanggan anu béda dina grup.
  2. Dina hiji grup, palanggan diidentipikasi ku namina, anu mangrupikeun senar sénsitip. Upami palanggan samentawis kaluar tina grup, anjeunna tiasa dibalikeun deui ka grup nganggo nami unik na.
  3. Unggal Grup Konsumén nuturkeun konsép "pesen anu teu dibaca munggaran". Nalika palanggan menta pesen anyar, éta ngan ukur tiasa nampi pesen anu henteu kantos dikirimkeun ka palanggan mana waé dina grup.
  4. Aya paréntah pikeun mastikeun sacara eksplisit yén pesen éta suksés diolah ku palanggan. Dugi paréntah ieu disebut, pesen anu dipénta bakal tetep dina status "pending".
  5. Dina Grup Konsumén, unggal palanggan tiasa nyuhunkeun riwayat pesen anu dikirimkeun ka anjeunna, tapi henteu acan diolah (dina status "pending")

Dina harti, kaayaan grup bisa ditembongkeun saperti kieu:

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

Ayeuna waktuna pikeun ngenalkeun paréntah utama pikeun Grup Konsumén, nyaéta:

  • XGROUP dipaké pikeun nyieun, ngancurkeun jeung ngatur grup
  • XREADGROUP dipaké pikeun maca stream ngaliwatan grup
  • XACK - paréntah ieu ngamungkinkeun palanggan pikeun nandaan pesen salaku hasil diolah

Nyiptakeun Grup Konsumén

Hayu urang nganggap yén mystream geus aya. Lajeng paréntah nyieun grup bakal kasampak kawas:

> XGROUP CREATE mystream mygroup $
OK

Nalika nyieun grup, urang kudu lulus hiji identifier, mimitian ti mana grup bakal nampa pesen. Upami urang ngan ukur hoyong nampi sadaya pesen énggal, maka urang tiasa nganggo identifier khusus $ (sapertos conto di luhur). Upami anjeun netepkeun 0 tibatan identifier khusus, maka sadaya pesen dina benang bakal sayogi pikeun grup.

Ayeuna grup dijieun, urang bisa langsung ngamimitian maca pesen maké paréntah XREADGROUP. Paréntah ieu pisan sarupa XBACA tur ngarojong pilihan BLOCK pilihan. Nanging, aya pilihan GROUP anu diperyogikeun anu kedah disebatkeun ku dua argumen: nami grup sareng nami palanggan. Pilihan COUNT ogé dirojong.

Sateuacan maca thread, hayu urang nempatkeun sababaraha pesen di dinya:

> 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

Ayeuna hayu urang coba maca aliran ieu ngaliwatan grup:

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

Paréntah di luhur maca verbatim sapertos kieu:

"Kuring, palanggan Alice, anggota mygroup, hoyong maca hiji pesen ti mystream anu henteu acan kantos dikirimkeun ka saha waé."

Unggal waktos palanggan ngalakukeun operasi dina grup, éta kedah nyayogikeun namina, sacara unik ngaidentipikasi dirina dina grup. Aya hiji deui detil anu penting pisan dina paréntah di luhur - identifier khusus ">". Identifier husus ieu nyaring talatah, ngan nyésakeun nu teu kungsi dikirimkeun saméméh.

Ogé, dina kasus husus, Anjeun bisa nangtukeun hiji identifier nyata kayaning 0 atawa identifier valid lianna. Dina hal ieu paréntah XREADGROUP bakal ngabalikeun anjeun riwayat pesen kalayan status "pending" anu dikirimkeun ka palanggan anu ditangtukeun (Alice) tapi henteu acan diakui nganggo paréntah. XACK.

Urang bisa nguji kabiasaan ieu ku geuwat nangtukeun ID 0, tanpa pilihan ngitung. Urang ngan saukur bakal ningali pesen anu ditangguhkeun, nyaéta, pesen apel:

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

Nanging, upami kami mastikeun pesenna parantos diolah, maka éta moal ditingalikeun deui:

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

Ayeuna giliran Bob maca hiji hal:

> 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, anggota mygroup, naroskeun henteu langkung ti dua pesen. Paréntah ngan ukur ngalaporkeun pesen anu henteu dikirimkeun kusabab idéntifikasi khusus ">". Sakumaha anjeun tiasa tingali, pesen "apel" moal ditampilkeun sabab geus dikirimkeun ka Alice, jadi Bob narima "jeruk" jeung "strawberry".

Ku cara ieu, Alice, Bob, sareng palanggan grup anu sanés tiasa maca pesen anu béda tina aliran anu sami. Éta ogé tiasa maca sajarah pesen anu teu acan diolah atanapi nandaan pesen anu parantos diolah.

Aya sababaraha hal anu kudu diperhatikeun:

  • Pas langganan nganggap pesen éta paréntah XREADGROUP, pesen ieu asup kana kaayaan "pending" sareng ditugaskeun ka palanggan khusus éta. Palanggan grup sanés moal tiasa maca pesen ieu.
  • Palanggan sacara otomatis didamel nalika disebatkeun heula, henteu kedah sacara eksplisit nyiptakeunana.
  • jeung XREADGROUP Anjeun tiasa maca pesen tina sababaraha utas anu béda dina waktos anu sami, tapi supados ieu tiasa dianggo, anjeun kedah mimiti nyiptakeun grup anu nami anu sami pikeun unggal utas nganggo XGROUP

Pamulihan saatos gagal

Palanggan tiasa pulih tina kagagalan sareng maca deui daptar pesenna kalayan status "pending". Nanging, di dunya nyata, palanggan tiasa tungtungna gagal. Naon anu lumangsung kana pesen palanggan anu macét upami palanggan henteu tiasa pulih tina gagalna?
Grup Konsumén nawiskeun fitur anu dianggo pikeun kasus sapertos kitu - nalika anjeun kedah ngarobih nu gaduh pesen.

Hal kahiji anu anjeun kedah laksanakeun nyaéta nelepon paréntah XPENDING, nu mintonkeun sadaya talatah dina grup jeung statusna "pending". Dina bentuk pangbasajanna, paréntah disebut ngan ukur dua alesan: nami utas sareng nami grup:

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

Tim éta nampilkeun jumlah pesen anu teu diolah pikeun sakabéh grup sareng unggal palanggan. Urang ngan boga Bob dua pesen beredar sabab hijina pesen Alice dipénta dikonfirmasi kalawan XACK.

Urang tiasa nyuhunkeun langkung seueur inpormasi nganggo langkung seueur argumen:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - rentang idéntifikasi (anjeun tiasa nganggo "-" sareng "+")
{count} — jumlah usaha pangiriman
{ngaran konsumen} - ngaran grup

> 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

Ayeuna kami gaduh detil pikeun unggal pesen: ID, nami palanggan, waktos dianggurkeun dina milliseconds sareng tungtungna jumlah usaha pangiriman. Kami ngagaduhan dua pesen ti Bob sareng aranjeunna parantos dianggurkeun salami 74170458 milidetik, sakitar 20 jam.

Punten dicatet yén teu aya anu ngahalangan urang mariksa naon eusi suratna ngan saukur nganggo XRANGE.

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

Urang ngan kudu ngulang identifier sarua dua kali dina argumen. Ayeuna urang gaduh sababaraha ide, Alice panginten tiasa mutuskeun yén saatos 20 jam waktos downtime, Bob sigana moal pulih, sareng waktosna pikeun naroskeun pesen-pesen éta sareng neruskeun ngolahna pikeun Bob. Pikeun ieu kami nganggo paréntah XCLAIM:

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

Nganggo paréntah ieu, urang tiasa nampi pesen "asing" anu henteu acan diolah ku cara ngarobih juragan janten {consumer}. Nanging, urang ogé tiasa nyayogikeun waktos dianggurkeun minimum {min-idle-time}. Ieu ngabantosan ngahindarkeun kaayaan dimana dua klien nyobian sakaligus ngarobih nu gaduh pesen anu sami:

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

Konsumén kahiji bakal ngareset downtime sareng ningkatkeun counter pangiriman. Janten klien kadua moal tiasa naroskeunana.

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

Suratna suksés diklaim ku Alice, anu ayeuna tiasa ngolah pesen sareng ngaku.

Tina conto di luhur, anjeun tiasa ningali yén pamundut anu suksés ngabalikeun eusi pesen éta sorangan. Sanajan kitu, ieu teu perlu. Pilihan JUSTID tiasa dianggo pikeun mulangkeun ID pesen wungkul. Ieu kapaké upami anjeun henteu resep kana detil pesen sareng hoyong ningkatkeun kinerja sistem.

counter pangiriman

The counter nu katingali dina kaluaran XPENDING nyaeta jumlah pangiriman unggal pesen. counter sapertos ieu incremented dina dua cara: lamun pesen suksés dipénta via XCLAIM atawa lamun nelepon dipaké XREADGROUP.

Biasana sababaraha pesen dikirimkeun sababaraha kali. Hal utama nyaéta yén sadaya pesen ahirna diolah. Kadang-kadang aya masalah nalika ngolah pesen kusabab pesen sorangan rusak, atanapi pamrosésan pesen nyababkeun kasalahan dina kode panangan. Dina hal ieu, sigana teu aya anu tiasa ngolah pesen ieu. Kusabab urang gaduh counter usaha pangiriman, urang tiasa nganggo counter ieu pikeun ngadeteksi kaayaan sapertos kitu. Ku alatan éta, sakali jumlah pangiriman ngahontal jumlah luhur anjeun tangtukeun, eta meureun bakal leuwih wijaksana pikeun nempatkeun pesen misalna dina thread sejen tur ngirim bewara ka administrator sistem.

Kaayaan Thread

regu XINFO dipaké pikeun ménta rupa-rupa informasi ngeunaan hiji thread jeung grup na. Salaku conto, paréntah dasar sapertos kieu:

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

Paréntah di luhur nunjukkeun inpormasi umum ngeunaan aliran anu ditangtukeun. Ayeuna conto anu rada rumit:

> 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

Paréntah di luhur mintonkeun informasi umum pikeun sakabéh grup tina thread nu ditangtukeun

> 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

Paréntah di luhur nunjukkeun inpormasi pikeun sadaya palanggan aliran sareng grup anu ditangtukeun.
Upami anjeun hilap sintaksis paréntah, naroskeun paréntah nyalira pikeun pitulung:

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

Wates Ukuran Stream

Seueur aplikasi anu henteu hoyong ngumpulkeun data kana aliran salamina. Éta sering kapaké pikeun gaduh jumlah maksimal pesen anu diidinan per thread. Dina kasus séjén, éta mangpaat pikeun mindahkeun sadaya seratan ti thread ka toko pengkuh sejen lamun ukuran thread dieusian geus ngahontal. Anjeun tiasa ngawates ukuran aliran ngagunakeun parameter MAXLEN dina paréntah 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"

Lamun maké MAXLEN, rékaman heubeul otomatis dihapus nalika aranjeunna ngahontal panjang nu tangtu, jadi stream ngabogaan ukuran konstan. Nanging, pruning dina hal ieu henteu lumangsung dina cara anu paling éfisién dina mémori Redis. Anjeun tiasa ningkatkeun kaayaan sapertos kieu:

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

Argumen ~ dina conto di luhur ngandung harti yén urang teu merta kudu ngawatesan panjang stream ka nilai husus. Dina conto urang, ieu tiasa janten nomer anu langkung ageung atanapi sami sareng 1000 (contona, 1000, 1010, atanapi 1030). Kami ngan sacara eksplisit nyatakeun yén kami hoyong aliran kami pikeun nyimpen sahenteuna 1000 rékaman. Hal ieu ngajadikeun manajemén memori jauh leuwih efisien di jero Redis.

Aya ogé tim anu misah XTRIM, anu ngalakukeun hal anu sami:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

Panyimpenan pengkuh sareng réplikasi

Redis Stream ieu asynchronously replicated ka titik budak tur disimpen ka file kawas AOF (snapshot sadaya data) jeung RDB (log sadaya operasi nulis). Réplikasi kaayaan Grup Konsumén ogé dirojong. Kukituna, upami pesen aya dina status "pending" dina titik master, teras dina titik budak pesen ieu bakal ngagaduhan status anu sami.

Nyoplokkeun elemen individu ti stream a

Aya paréntah khusus pikeun mupus pesen XDEL. Paréntahna nampi nami benang anu dituturkeun ku ID pesen anu bakal dihapus:

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

Nalika nganggo paréntah ieu, anjeun kedah émut yén mémori saleresna moal dileupaskeun langsung.

Nol panjang aliran

Beda antara aliran sareng struktur data Redis anu sanés nyaéta nalika struktur data sanés henteu gaduh elemen dina éta, salaku éfék samping, struktur data éta sorangan bakal dipiceun tina mémori. Ku kituna, contona, susunan diurutkeun bakal sagemblengna dipiceun nalika panggero ZREM ngaluarkeun unsur panungtungan. Sabalikna, benang diidinan tetep dina mémori sanaos henteu ngagaduhan unsur di jero.

kacindekan

Redis Stream idéal pikeun nyieun calo pesen, antrian pesen, logging ngahiji, sareng sistem obrolan anu ngajaga sajarah.

Sakumaha kuring kantos nyarios Niklaus Wirth, program anu algoritma tambah struktur data, sarta Redis geus mere Anjeun duanana.

sumber: www.habr.com

Tambahkeun komentar