Redis Stream - linuwih lan skalabilitas sistem olahpesen sampeyan

Redis Stream - linuwih lan skalabilitas sistem olahpesen sampeyan

Redis Stream minangka jinis data abstrak anyar sing dikenalake ing Redis kanthi versi 5.0
Secara konseptual, Redis Stream minangka Dhaptar sing bisa ditambahake entri. Saben entri duwe pengenal unik. Kanthi gawan, ID digawe kanthi otomatis lan kalebu stempel wektu. Mulane, sampeyan bisa takon sawetara cathetan liwat wektu, utawa nampa data anyar nalika teka ing stream, kaya printah Unix "buntut -f" maca file log lan freezes nalika nunggu data anyar. Elinga yen sawetara klien bisa ngrungokake thread ing wektu sing padha, kaya akeh proses "buntut -f" bisa maca file bebarengan tanpa konflik siji liyane.

Kanggo mangerteni kabeh mupangat saka jinis data anyar, ayo goleki kanthi cepet babagan struktur Redis sing wis suwe, sing sebagian niru fungsi Redis Stream.

Redis PUB/SUB

Redis Pub/Sub minangka sistem olahpesen prasaja sing wis dibangun ing toko nilai kunci sampeyan. Nanging, kesederhanaan teka kanthi rega:

  • Yen penerbit gagal amarga sawetara alasan, banjur kelangan kabeh pelanggan
  • Penerbit kudu ngerti alamat pas kabeh pelanggan
  • Penerbit bisa kakehan karya pelanggan yen data diterbitake luwih cepet tinimbang diproses
  • Pesen dibusak saka buffer penerbit sanalika sawise publikasi, preduli saka carane akeh pelanggan dikirim menyang lan carane cepet padha bisa kanggo proses pesen iki.
  • Kabeh pelanggan bakal nampa pesen ing wektu sing padha. Pelanggan dhewe kudu sarujuk ing urutan ngolah pesen sing padha.
  • Ora ana mekanisme sing dibangun kanggo konfirmasi manawa pelanggan wis sukses ngolah pesen. Yen pelanggan nampa pesen lan kacilakan sajrone proses, penerbit ora bakal ngerti babagan kasebut.

Daftar Redis

Daftar Redis minangka struktur data sing ndhukung pamblokiran perintah maca. Sampeyan bisa nambah lan maca pesen saka wiwitan utawa pungkasan dhaptar. Adhedhasar struktur iki, sampeyan bisa nggawe tumpukan apik utawa antrian kanggo sistem mbagekke, lan ing paling kasus iki bakal cukup. Bedane utama saka Redis Pub/Sub:

  • Pesen dikirim menyang siji klien. Klien sing diblokir diwaca pisanan bakal nampa data luwih dhisik.
  • Clint kudu miwiti operasi maca kanggo saben pesen dhewe. Dhaptar ora ngerti apa-apa babagan klien.
  • Pesen disimpen nganti ana sing maca utawa mbusak kanthi jelas. Yen sampeyan ngatur server Redis kanggo siram data menyang disk, linuwih sistem mundhak dramatically.

Pambuka kanggo Stream

Nambahake entri menyang stream

tim XADD nambah entri anyar menyang stream. Rekaman ora mung senar, kalebu siji utawa luwih pasangan nilai kunci. Dadi, saben entri wis kabentuk lan meh padha karo struktur file CSV.

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

Ing conto ing ndhuwur, kita nambah rong kolom menyang stream kanthi jeneng (kunci) "mystream": "sensor-id" lan "suhu" kanthi nilai "1234" lan "19.8". Minangka argumen kapindho, printah kasebut njupuk pengenal sing bakal ditugasake menyang entri - pengenal iki kanthi unik ngenali saben entri ing stream kasebut. Nanging, ing kasus iki, kita lulus * amarga kita pengin Redis ngasilake ID anyar kanggo kita. Saben ID anyar bakal nambah. Mulane, saben entri anyar bakal duwe pengenal sing luwih dhuwur ing hubungane karo entri sadurunge.

Format pengenal

ID entri bali dening printah XADD, kasusun saka rong bagean:

{millisecondsTime}-{sequenceNumber}

milidetikWaktu - Wektu Unix ing milliseconds (wektu server Redis). Nanging, yen wektu saiki padha utawa kurang saka wektu rekaman sadurunge, banjur stempel wektu rekaman sadurunge digunakake. Mulane, yen wektu server bali ing wektu, pengenal anyar isih bakal nahan properti increment.

urutanNomer digunakake kanggo rekaman digawe ing milidetik padha. urutanNomer bakal tambah 1 relatif kanggo entri sadurungΓ©. Amarga ing urutanNomer punika 64 bit ing ukuran, banjur ing laku sampeyan ora kudu mbukak menyang watesan ing nomer cathetan sing bisa kui ing siji millisecond.

Format pengenal kasebut bisa uga katon aneh nalika sepisanan. Sing maca sing ora percaya bisa uga mikir kenapa wektu minangka bagean saka pengenal. Alesane yaiku aliran Redis ndhukung pitakon sawetara kanthi ID. Wiwit pengenal digandhengake karo wektu rekaman digawe, iki ndadekake iku bisa kanggo query rentang wektu. Kita bakal ndeleng conto tartamtu nalika ndeleng perintah kasebut XRANGE.

Yen sakperangan alesan pangguna kudu nemtokake pengenal dhewe, kang, contone, digandhengake karo sawetara sistem njaba, banjur kita bisa pass menyang printah. XADD tinimbang * kaya sing kapacak ing ngisor iki:

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

Elinga yen ing kasus iki, sampeyan kudu ngawasi kenaikan ID dhewe. Ing conto kita, pengenal minimal yaiku "0-1", mula prentah kasebut ora bakal nampa pengenal liyane sing padha karo utawa kurang saka "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 rekaman saben stream

Sampeyan bisa njaluk nomer cathetan ing stream mung nggunakake printah XLEN. Contone, printah iki bakal ngasilake nilai ing ngisor iki:

> XLEN somestream
(integer) 2

Pitakonan kisaran - XRANGE lan XREVRANGE

Kanggo njaluk data miturut jangkoan, kita kudu nemtokake rong pengenal - wiwitan lan pungkasan jangkoan. Kisaran bali bakal kalebu kabeh unsur, kalebu wates. Ana uga loro pengenal khusus "-" lan "+", mungguh tegese pengenal paling cilik (rekaman pisanan) lan paling gedhe (rekaman pungkasan) ing stream. Conto ing ngisor iki bakal nampilake kabeh entri 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"

Saben rekaman bali minangka array saka rong unsur: pengenal lan dhaptar pasangan kunci-nilai. Kita wis ujar manawa pengenal rekaman ana gandhengane karo wektu. Mula, kita bisa njaluk sawetara wektu tartamtu. Nanging, kita bisa nemtokake ing panyuwunan ora pengenal lengkap, nanging mung wektu Unix, omitting bagean related kanggo urutanNomer. Bagean pengenal sing diilangi bakal kanthi otomatis disetel menyang nol ing wiwitan jangkoan lan menyang nilai maksimum sing bisa ditindakake ing pungkasan jangkoan. Ing ngisor iki conto carane sampeyan bisa njaluk sawetara rong milidetik.

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

Kita mung duwe siji entri ing sawetara iki, nanging ing set data nyata asil bali bisa dadi gedhe. Kanggo alasan iki XRANGE ndhukung pilihan COUNT. Kanthi nemtokake jumlah, kita mung bisa entuk cathetan N pisanan. Yen kita kudu njaluk cathetan N sabanjurΓ© (pagination), kita bisa nggunakake ID pungkasan ditampa, nambah urutanNomer dening siji lan takon maneh. Ayo katon ing conto ing ngisor iki. Kita miwiti nambah 10 unsur karo XADD (assuming mystream wis diisi karo 10 unsur). Kanggo miwiti iterasi njupuk 2 unsur saben printah, kita miwiti karo sawetara lengkap nanging karo COUNT padha karo 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"

Kanggo nerusake iterasi karo rong unsur sabanjure, kita kudu milih ID pungkasan sing ditampa, yaiku 1519073279157-0, lan nambah 1 menyang urutanNomer.
ID sing diasilake, ing kasus iki 1519073279157-1, saiki bisa digunakake minangka argumen wiwitan anyar kanggo telpon sabanjure 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"

Lan sateruse. Amarga kerumitan XRANGE punika O (log (N)) kanggo nelusuri lan banjur O (M) bali unsur M, banjur saben langkah pengulangan cepet. Mangkono, nggunakake XRANGE aliran bisa diulang kanthi efisien.

tim XREVRANGE iku padha karo XRANGE, nanging ngasilake unsur ing urutan mbalikke:

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

Elinga yen printah XREVRANGE njupuk bantahan sawetara miwiti lan mungkasi ing urutan mbalikke.

Maca entri anyar nggunakake XREAD

Asring tugas muncul kanggo langganan stream lan mung nampa pesen anyar. Konsep iki bisa uga katon padha karo Redis Pub/Sub utawa mblokir Daftar Redis, nanging ana prabΓ©dan dhasar babagan cara nggunakake Redis Stream:

  1. Saben pesen anyar dikirim menyang saben pelanggan kanthi standar. Prilaku iki beda karo dhaptar Redis sing ngalangi, ing ngendi pesen anyar mung bakal diwaca dening siji pelanggan.
  2. Nalika ing Redis Pub/Sub kabeh pesen dilalekake lan ora nate tetep, ing Stream kabeh pesen disimpen tanpa wates (kajaba klien kasebut kanthi jelas nyebabake pambusakan).
  3. Redis Stream ngidini sampeyan mbedakake akses menyang pesen ing siji stream. Pelanggan tartamtu mung bisa ndeleng riwayat pesen pribadhi.

Sampeyan bisa langganan thread lan nampa pesen anyar nggunakake printah XREAD. Iku sethitik liyane rumit saka XRANGE, dadi kita bakal miwiti karo conto sing luwih prasaja dhisik.

> 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 ing ndhuwur nuduhake wangun non-blocking XREAD. Elinga yen opsi COUNT iku opsional. Nyatane, mung pilihan printah sing dibutuhake yaiku pilihan STREAMS, sing nemtokake dhaptar stream bebarengan karo pengenal maksimum sing cocog. Kita nulis "STREAMS mystream 0" - kita pengin nampa kabeh cathetan aliran mystream kanthi pengenal luwih saka "0-0". Kaya sing sampeyan deleng saka conto, printah kasebut ngasilake jeneng utas amarga kita bisa langganan pirang-pirang utas bebarengan. Kita bisa nulis, contone, "STREAMS mystream otherstream 0 0". Elinga yen sawise pilihan STREAMS, kita kudu menehi jeneng kabeh aliran sing dibutuhake lan mung banjur dhaptar pengenal.

Ing wangun prasaja iki printah ora nindakake apa-apa khusus dibandhingake karo XRANGE. Nanging, sing menarik yaiku kita bisa kanthi gampang nguripake XREAD menyang perintah pamblokiran, nemtokake argumen BLOCK:

> XREAD BLOCK 0 STREAMS mystream $

Ing conto ing ndhuwur, opsi BLOCK anyar ditemtokake kanthi wektu entek 0 milidetik (tegese ngenteni tanpa wates). Kajaba iku, tinimbang ngliwati pengenal biasa kanggo stream mystream, pengenal khusus $ dilewati. Pengenal khusus iki tegese XREAD kudu nggunakake pengenal maksimum ing mystream minangka pengenal. Dadi, kita mung bakal nampa pesen anyar wiwit wiwit ngrungokake. Ing sawetara cara iki padha karo printah Unix "buntut -f".

Elinga yen nalika nggunakake opsi BLOCK kita ora kudu nggunakake pengenal khusus $. Kita bisa nggunakake sembarang pengenal ana ing stream. Yen tim bisa langsung nglayani panyuwunan kita tanpa ngalangi, mula bakal ditindakake, yen ora bakal diblokir.

Pamblokiran XREAD uga bisa ngrungokake sawetara utas bebarengan, sampeyan mung kudu nemtokake jeneng. Ing kasus iki, printah bakal ngasilake rekaman stream pisanan sing nampa data. Pelanggan pisanan sing diblokir kanggo thread tartamtu bakal nampa data luwih dhisik.

Kelompok Konsumen

Ing tugas tartamtu, kita pengin mbatesi akses pelanggan menyang pesen ing siji utas. Conto sing bisa migunani yaiku antrian pesen karo para pekerja sing bakal nampa pesen sing beda-beda saka benang, ngidini pangolahan pesen ukuran.

Yen kita mbayangno yen kita duwe telung pelanggan C1, C2, C3 lan utas sing ngemot pesen 1, 2, 3, 4, 5, 6, 7, banjur pesen kasebut bakal diwenehake kaya ing diagram ing ngisor iki:

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

Kanggo entuk efek iki, Redis Stream nggunakake konsep sing diarani Consumer Group. Konsep iki padha karo pseudo-subscriber, sing nampa data saka stream, nanging bener dilayani dening sawetara pelanggan ing grup, menehi jaminan tartamtu:

  1. Saben pesen dikirim menyang pelanggan sing beda ing grup kasebut.
  2. Ing grup, pelanggan diidentifikasi kanthi jeneng, yaiku string sensitif huruf cilik. Yen pelanggan metu saka grup kanggo sementara, dheweke bisa dibalekake menyang grup nggunakake jeneng unik dhewe.
  3. Saben Grup Konsumen ngetutake konsep "pesen pisanan sing durung diwaca". Nalika pelanggan njaluk pesen anyar, mung bisa nampa pesen sing durung tau dikirim menyang pelanggan ing grup kasebut.
  4. Ana prentah kanggo konfirmasi kanthi jelas manawa pesen kasebut sukses diproses dening pelanggan. Nganti printah iki disebut, pesen sing dijaluk bakal tetep ing status "tundha".
  5. Ing Grup Konsumen, saben pelanggan bisa njaluk riwayat pesen sing dikirim menyang dheweke, nanging durung diproses (ing status "pending")

Ing pangertèn, kahanan klompok bisa diterangake kaya ing ngisor iki:

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

Saiki wektune kanggo kenal karo perintah utama kanggo Grup Konsumen, yaiku:

  • XGROUP digunakake kanggo nggawe, numpes lan ngatur grup
  • XREADGROUP digunakake kanggo maca stream liwat grup
  • XACK - printah iki ngidini pelanggan nandhani pesen minangka kasil diproses

Nggawe Grup Konsumen

Ayo nganggep yen mystream wis ana. Banjur printah nggawe grup bakal katon kaya:

> XGROUP CREATE mystream mygroup $
OK

Nalika nggawe grup, kita kudu ngliwati pengenal, wiwit saka grup kasebut bakal nampa pesen. Yen kita mung pengin nampa kabeh pesen anyar, banjur kita bisa nggunakake pengenal khusus $ (kaya conto ing ndhuwur). Yen sampeyan nemtokake 0 tinimbang pengenal khusus, kabeh pesen ing thread bakal kasedhiya kanggo grup.

Saiki grup wis digawe, kita bisa langsung miwiti maca pesen nggunakake printah XREADGROUP. Printah iki meh padha karo XREAD lan ndhukung opsi BLOCK opsional. Nanging, ana opsi GROUP sing dibutuhake sing kudu ditemtokake kanthi rong argumen: jeneng grup lan jeneng pelanggan. Opsi COUNT uga didhukung.

Sadurunge maca thread, ayo sijine sawetara pesen ing kana:

> 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

Saiki ayo nyoba maca stream iki liwat grup:

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

Prentah ing ndhuwur maca verbatim kaya ing ngisor iki:

"Aku, pelanggan Alice, anggota mygroup, pengin maca pesen saka mystream sing durung tau dikirim menyang sapa wae."

Saben pelanggan nindakake operasi ing grup, kudu menehi jeneng, kanthi unik ngenali dhewe ing grup kasebut. Ana siji rincian liyane sing penting banget ing printah ing ndhuwur - pengenal khusus ">". Pengenal khusus iki nyaring pesen, mung ninggalake pesen sing durung tau dikirim.

Uga, ing kasus khusus, sampeyan bisa nemtokake pengenal nyata kayata 0 utawa pengenal sah liyane. Ing kasus iki printah XREADGROUP bakal ngasilake riwayat pesen kanthi status "tunggu" sing dikirim menyang pelanggan sing ditemtokake (Alice) nanging durung diakoni nggunakake perintah kasebut XACK.

Kita bisa nyoba prilaku iki kanthi langsung nemtokake ID 0, tanpa pilihan COUNT. Kita mung bakal ndeleng pesen sing ditundha, yaiku pesen apel:

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

Nanging, yen kita konfirmasi pesen kasebut wis diproses, mula ora bakal ditampilake maneh:

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

Saiki giliran Bob maca:

> 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, njaluk ora luwih saka rong pesen. Printah mung nglaporake pesen sing ora dikirim amarga pengenal khusus ">". Kaya sing sampeyan ngerteni, pesen "apel" ora bakal ditampilake amarga wis dikirim menyang Alice, mula Bob nampa "oranye" lan "strawberry".

Kanthi cara iki, Alice, Bob, lan pelanggan liyane ing grup bisa maca pesen sing beda saka aliran sing padha. Dheweke uga bisa maca riwayat pesen sing durung diproses utawa menehi tandha yen wis diproses.

Ana sawetara perkara sing kudu dielingi:

  • Sanalika pelanggan nganggep pesen kasebut minangka prentah XREADGROUP, pesen iki dadi "tundha" negara lan diutus kanggo pelanggan tartamtu. Pelanggan grup liyane ora bakal bisa maca pesen iki.
  • Pelanggan digawe kanthi otomatis nalika kasebut pisanan, ora perlu nggawe kanthi jelas.
  • Kanthi bantuan saka XREADGROUP sampeyan bisa maca pesen saka macem-macem utas ing wektu sing padha, nanging supaya iki bisa digunakake, sampeyan kudu nggawe grup kanthi jeneng sing padha kanggo saben thread nggunakake XGROUP

Recovery sawise Gagal

Pelanggan bisa pulih saka kegagalan lan maca maneh dhaptar pesen kanthi status "tundha". Nanging, ing jagad nyata, pelanggan bisa uga gagal. Apa sing kedadeyan karo pesen pelanggan sing macet yen pelanggan ora bisa pulih saka kegagalan?
Grup Konsumen nawakake fitur sing digunakake kanggo kasus kaya ngono - nalika sampeyan kudu ngganti pemilik pesen.

Wangsulan: Bab ingkang pisanan sampeyan kudu nindakake iku nelpon printah XPENDING, sing nampilake kabeh pesen ing grup kanthi status "tunggu". Ing wangun sing paling gampang, printah kasebut mung nganggo rong argumen: jeneng utas lan jeneng grup:

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

Tim kasebut nampilake jumlah pesen sing durung diproses kanggo kabeh grup lan saben pelanggan. Kita mung duwe Bob karo rong pesen sing luar biasa amarga pesen sing dijaluk Alice mung dikonfirmasi XACK.

Kita bisa njaluk informasi luwih akeh nggunakake argumen liyane:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - sawetara pengenal (sampeyan bisa nggunakake "-" lan "+")
{count} β€” nomer nyoba pangiriman
{consumer-name} - jeneng 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

Saiki kita duwe rincian kanggo saben pesen: ID, jeneng pelanggan, wektu nganggur ing milidetik lan pungkasane jumlah upaya pangiriman. Kita duwe rong pesen saka Bob lan wis nganggur nganti 74170458 milidetik, kira-kira 20 jam.

Wigati dimangerteni manawa ora ana sing ngalangi kita mriksa apa isi pesen kasebut mung kanthi nggunakake XRANGE.

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

Kita mung kudu mbaleni pengenal sing padha kaping pindho ing argumentasi. Saiki kita duwe sawetara gagasan, Alice bisa mutusake yen sawise 20 jam downtime, Bob mbokmenawa ora bakal pulih, lan wektune kanggo takon pesen kasebut lan nerusake proses kanggo Bob. Kanggo iki kita nggunakake printah XCLAIM:

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

Nggunakake printah iki, kita bisa nampa pesen "manca" sing durung diproses kanthi ngganti pemilik dadi {consumer}. Nanging, kita uga bisa nyedhiyani wektu idle minimal {min-idle-time}. Iki mbantu supaya ora ana kahanan ing ngendi loro klien nyoba ngganti pemilik pesen sing padha:

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

Pelanggan pisanan bakal ngreset downtime lan nambah counter pangiriman. Dadi klien kapindho ora bakal bisa njaluk.

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

Pesen kasebut kasil diklaim dening Alice, sing saiki bisa ngolah pesen kasebut lan ngakoni.

Saka conto ing ndhuwur, sampeyan bisa ndeleng manawa panjaluk sing sukses ngasilake isi pesen kasebut dhewe. Nanging, iki ora perlu. Opsi JUSTID mung bisa digunakake kanggo ngasilake ID pesen. Iki migunani yen sampeyan ora kasengsem ing rincian pesen lan pengin nambah kinerja sistem.

counter pangiriman

Counter sampeyan ndeleng ing output XPENDING yaiku jumlah kiriman saben pesen. Counter kasebut ditambah kanthi rong cara: nalika pesen kasil dijaluk liwat XCLAIM utawa nalika telpon digunakake XREADGROUP.

Biasane sawetara pesen dikirim kaping pirang-pirang. Sing utama yaiku kabeh pesen pungkasane diproses. Kadhangkala ana masalah nalika ngolah pesen amarga pesen kasebut rusak, utawa pangolahan pesen nyebabake kesalahan ing kode pawang. Ing kasus iki, bisa uga ora ana sing bisa ngolah pesen iki. Awit kita duwe counter nyoba pangiriman, kita bisa nggunakake counter iki kanggo ndeteksi kahanan kaya mengkono. Mulane, yen jumlah pangiriman tekan jumlah sing sampeyan nemtokake, mesthine luwih wicaksana kanggo nyelehake pesen kasebut ing thread liyane lan ngirim kabar menyang administrator sistem.

Negara Thread

tim XINFO digunakake kanggo njaluk macem-macem informasi babagan utas lan klompok. Contone, printah dhasar katon kaya iki:

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

Printah ing ndhuwur nampilake informasi umum babagan aliran kasebut. Saiki conto sing 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

Printah ing ndhuwur nampilake informasi umum kanggo kabeh klompok utas sing ditemtokake

> 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

Printah ing ndhuwur nampilake informasi kanggo kabeh pelanggan saka stream lan grup sing ditemtokake.
Yen sampeyan lali sintaks printah, mung takon printah dhewe kanggo bantuan:

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

Limit Ukuran Stream

Akeh aplikasi ora pengin ngumpulake data menyang stream ing salawas-lawase. Asring migunani yen jumlah maksimum pesen sing diidini saben thread. Ing kasus liyane, iku migunani kanggo mindhah kabeh pesen saka thread kanggo nyimpen ngengkel liyane nalika ukuran thread tartamtu wis tekan. Sampeyan bisa matesi ukuran stream nggunakake parameter MAXLEN ing printah 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"

Nalika nggunakake MAXLEN, cathetan lawas kanthi otomatis dibusak nalika tekan dawa tartamtu, supaya stream duwe ukuran pancet. Nanging, pruning ing kasus iki ora kedadeyan kanthi cara sing paling efisien ing memori Redis. Sampeyan bisa nambah kahanan kaya ing ngisor iki:

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

Argumentasi ~ ing conto ing ndhuwur tegese kita ora kudu mbatesi dawa stream menyang nilai tartamtu. Ing conto kita, iki bisa dadi nomer sing luwih gedhe utawa padha karo 1000 (contone, 1000, 1010, utawa 1030). Kita mung kanthi tegas nyatakake yen kita pengin stream kita nyimpen paling ora 1000 rekaman. Iki ndadekake manajemen memori luwih efisien ing Redis.

Ana uga tim sing kapisah XTRIM, sing nindakake perkara sing padha:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

Panyimpenan lan replikasi sing terus-terusan

Redis Stream ditiru kanthi ora sinkron menyang simpul budak lan disimpen menyang file kaya AOF (snapshot kabeh data) lan RDB (log kabeh operasi nulis). Replikasi negara Grup Konsumen uga didhukung. Mulane, yen pesen ana ing status "pending" ing simpul master, banjur ing simpul budak pesen iki bakal duwe status sing padha.

Mbusak unsur individu saka stream

Ana prentah khusus kanggo mbusak pesen XDEL. Printah kasebut entuk jeneng utas sing diikuti karo ID pesen sing bakal dibusak:

> 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 nggunakake printah iki, sampeyan kudu njupuk menyang akun sing memori nyata ora bakal dirilis langsung.

Zero dawa stream

Bentenipun antarane stream lan struktur data Redis liyane iku nalika struktur data liyane ora ana maneh unsur ing, minangka efek sisih, struktur data dhewe bakal dibusak saka memori. Dadi, contone, pesawat diurutake bakal rampung dibusak nalika telpon ZREM mbusak unsur pungkasan. Nanging, benang diidini tetep ana ing memori sanajan ora ana unsur ing njero.

kesimpulan

Redis Stream cocog kanggo nggawe makelar pesen, antrian pesen, logging terpadu, lan sistem obrolan sing njaga sejarah.

Kaya sing dakkandhakake Niklaus Wirth, program minangka algoritma plus struktur data, lan Redis wis menehi sampeyan loro.

Source: www.habr.com

Add a comment