د ریډیس سټریم - ستاسو د پیغام رسولو سیسټمونو اعتبار او اندازه کول

د ریډیس سټریم - ستاسو د پیغام رسولو سیسټمونو اعتبار او اندازه کول

د ریډیس سټریم یو نوی خلاص ډیټا ډول دی چې په ریډیس کې د 5.0 نسخه سره معرفي شوی
په تصور کې، د ریډیس جریان یو لیست دی چې تاسو یې د ننوتلو اضافه کولی شئ. هر ننوتل یو ځانګړی پیژندونکی لري. د ډیفالټ په واسطه، ID په اوتومات ډول تولید کیږي او د مهال ویش شامل دي. له همدې امله ، تاسو کولی شئ د وخت په تیریدو سره د ریکارډونو سلسله وپوښتئ ، یا نوي ډیټا ترلاسه کړئ لکه څنګه چې جریان ته راځي ، لکه د یونیکس "tail -f" کمانډ د لاګ فایل لوستل او د نوي ډیټا په انتظار کې کنګل کیږي. په یاد ولرئ چې ډیری پیرودونکي کولی شي په ورته وخت کې یو تار ته غوږ ونیسي، لکه څنګه چې ډیری "tail-f" پروسې کولی شي په یو وخت کې د یو بل سره د شخړې پرته یو فایل ولولي.

د نوي ډیټا ډول ټولو ګټو پوهیدو لپاره ، راځئ چې د ریډیس پخوانیو جوړښتونو ته یو ګړندي نظر واخلو چې په جزوي ډول د ریډیس سټریم فعالیت نقل کوي.

Redis PUB/SUB

د Redis Pub/Sub یو ساده پیغام رسولو سیسټم دی چې دمخه ستاسو د کلیدي ارزښت پلورنځي کې جوړ شوی. په هرصورت، سادگي په قیمت کې راځي:

  • که خپرونکی د کوم دلیل لپاره ناکام شي، نو هغه خپل ټول پیرودونکي له لاسه ورکوي
  • خپرونکی باید د خپلو ټولو پیرودونکو دقیق پته پوه شي
  • یو خپرونکی ممکن خپل پیرودونکي د کار سره ډیر کړي که چیرې معلومات د پروسس شوي په پرتله ګړندي خپاره شي
  • پیغام له خپریدو سمدستي وروسته د خپرونکي بفر څخه حذف کیږي ، پرته لدې چې دا څومره پیرودونکو ته وسپارل شو او څومره ژر دوی وکولی شول دا پیغام پروسس کړي.
  • ټول پیرودونکي به په ورته وخت کې پیغام ترلاسه کړي. پیرودونکي پخپله باید د ورته پیغام پروسس کولو ترتیب په اړه یو څه په خپل منځ کې موافق وي.
  • هیڅ جوړ شوی میکانیزم شتون نلري ترڅو تایید کړي چې پیرودونکي په بریالیتوب سره یو پیغام پروسس کړی. که چیرې یو پیرودونکی یو پیغام ترلاسه کړي او د پروسس کولو په جریان کې خراب شي، خپرونکی به یې په اړه نه پوهیږي.

د Redis لیست

د ریډیس لیست د ډیټا جوړښت دی چې د لوستلو امرونو بلاک کولو ملاتړ کوي. تاسو کولی شئ د لیست له پیل یا پای څخه پیغامونه اضافه او ولولئ. د دې جوړښت پراساس، تاسو کولی شئ د خپل ویشل شوي سیسټم لپاره یو ښه سټیک یا قطار جوړ کړئ، او په ډیری مواردو کې دا به کافي وي. د Redis Pub/Sub څخه اصلي توپیرونه:

  • پیغام یو پیرودونکي ته سپارل کیږي. لومړی لوستل شوی بلاک شوی پیرودونکی به لومړی معلومات ترلاسه کړي.
  • کلینټ باید د هر پیغام لپاره د لوستلو عملیات پخپله پیل کړي. لیست د پیرودونکو په اړه هیڅ نه پوهیږي.
  • پیغامونه تر هغه وخته پورې ساتل کیږي چې څوک یې ولولي یا یې په ښکاره ډول حذف کړي. که تاسو ډیسک ته ډیټا فلش کولو لپاره د ریډیس سرور تنظیم کړئ ، نو د سیسټم اعتبار په ډراماتیک ډول لوړیږي.

د جریان پیژندنه

په جریان کې د ننوتلو اضافه کول

ټیم XADD جریان ته نوې ننوتل اضافه کوي. ریکارډ یوازې یو تار نه دی، دا د یو یا ډیرو کلیدي ارزښتونو جوړه جوړه ده. په دې توګه، هره داخله لا دمخه جوړه شوې او د CSV فایل جوړښت سره ورته وي.

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

په پورتني مثال کې، موږ د نوم (کیلي) "mystream" سره جریان ته دوه ساحې اضافه کوو: "سینسر-id" او "حرارت" په ترتیب سره د "1234" او "19.8" ارزښتونو سره. د دوهم دلیل په توګه، کمانډ یو پیژندونکی اخلي چې د ننوتلو لپاره به ګمارل کیږي - دا پیژندونکی په ځانګړي ډول په جریان کې هر ننوتل پیژني. په هرصورت، پدې حالت کې موږ تېر شو ځکه چې موږ غواړو Redis زموږ لپاره یو نوی ID تولید کړي. هر نوی ID به زیات شي. له همدې امله، هره نوې ننوتنه به د پخوانیو ننوتلو په پرتله لوړ پیژندونکی ولري.

د پیژندونکي بڼه

د ننوتلو ID د قوماندې لخوا بیرته راستانه شوی XADDد دوو برخو څخه جوړه ده:

{millisecondsTime}-{sequenceNumber}

د ملی ثانیو وخت - د یونیکس وخت په ملی ثانیو کې (د ریډیس سرور وخت). په هرصورت، که اوسنی وخت د تیر ثبت کولو وخت سره ورته وي یا لږ وي، نو د تیر ثبت کولو مهال ویش کارول کیږي. له همدې امله، که د سرور وخت په وخت کې بیرته لاړ شي، نو نوی پیژندونکی به لاهم د زیاتوالي ملکیت وساتي.

د ترتیب شمیره په ورته ملی ثانیه کې رامینځته شوي ریکارډونو لپاره کارول کیږي. د ترتیب شمیره د پخوانۍ ننوتلو په پرتله به د 1 لخوا زیات شي. ځکه چې د د ترتیب شمیره په اندازه کې 64 بټونه دي، نو په عمل کې تاسو باید د ریکارډونو شمیر محدودیت ته ونه رسئ چې په یو ملی ثانیه کې رامینځته کیدی شي.

د داسې پیژندونکو بڼه ممکن په لومړي نظر کې عجیب ښکاري. یو بې باوره لوستونکی شاید حیران شي چې ولې وخت د پیژندونکي برخه ده. دلیل یې دا دی چې ریډیس د 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"

هر راستانه شوی ریکارډ د دوو عناصرو لړۍ ده: یو پیژندونکی او د کلیدي ارزښت جوړو لیست. موږ دمخه وویل چې ریکارډ پیژندونکي د وخت سره تړاو لري. له همدې امله، موږ کولی شو د یوې ټاکلې مودې لپاره یو لړ غوښتنه وکړو. په هرصورت، موږ کولی شو په غوښتنلیک کې بشپړ پیژندونکی نه، مګر یوازې د یونکس وخت مشخص کړو، د اړونده برخې څخه لیرې کول. د ترتیب شمیره. د پیژندونکي پریښودل شوې برخه به په اوتومات ډول د حد په پیل کې صفر ته او د حد په پای کې اعظمي احتمالي ارزښت ته ټاکل کیږي. لاندې یو مثال دی چې تاسو څنګه کولی شئ د دوه ملی ثانیو حد غوښتنه وکړئ.

> 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 (فرض کول چې زما سټریم دمخه د 10 عناصرو څخه ډک شوی و). د تکرار پیل کولو لپاره په هر کمانډ کې د 2 عناصرو ترلاسه کول، موږ د بشپړ رینج سره پیل کوو مګر د 2 سره مساوي COUNT سره.

> 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. هر نوی پیغام هر پیرودونکي ته د ډیفالټ لخوا سپارل کیږي. دا چلند د بلاک کولو ریډیس لیست څخه توپیر لري ، چیرې چې یو نوی پیغام به یوازې د یو پیرودونکي لخوا لوستل کیږي.
  2. پداسې حال کې چې په ریډیس پب/سب کې ټول پیغامونه هیر شوي او هیڅکله دوام نه کوي ، په جریان کې ټول پیغامونه په نامعلوم وخت کې ساتل کیږي (مګر که چیرې پیرودونکي په څرګنده توګه د حذف کیدو لامل شي).
  3. د ریډیس سټریم تاسو ته اجازه درکوي په یوه جریان کې پیغامونو ته د لاسرسي توپیر وکړئ. یو ځانګړی پیرودونکي کولی شي یوازې د دوی شخصي پیغام تاریخ وګوري.

تاسو کولی شئ یو تار کې ګډون وکړئ او د کمانډ په کارولو سره نوي پیغامونه ترلاسه کړئ 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 اختیار اختیاري دی. په حقیقت کې ، یوازینی اړین کمانډ اختیار د سټریمس اختیار دی ، کوم چې د اړوند اعظمي پیژندونکي سره د جریانونو لیست مشخص کوي. موږ "سټریمز مای سټریم 0" لیکلي - موږ غواړو د مای سټریم جریان ټول ریکارډونه د "0-0" څخه لوی پیژندونکي سره ترلاسه کړو. لکه څنګه چې تاسو د مثال څخه لیدلی شئ، کمانډ د تار نوم بیرته راګرځوي ځکه چې موږ کولی شو په ورته وخت کې ډیری تارونو ته ګډون وکړو. موږ کولی شو د مثال په توګه "سټریمز مای سټریم otherstream 0 0" ولیکئ. مهرباني وکړئ په یاد ولرئ چې د سټریمز اختیار وروسته موږ اړتیا لرو لومړی د ټولو اړین جریانونو نومونه چمتو کړو او یوازې بیا د پیژندونکو لیست.

په دې ساده بڼه کې کمانډ په پرتله کوم ځانګړي کار نه کوي XRANGE. په هرصورت، په زړه پورې خبره دا ده چې موږ کولی شو په اسانۍ سره وګرځوو XREAD د بلاک کولو کمانډ ته، د بلاک دلیل مشخص کول:

> XREAD BLOCK 0 STREAMS mystream $

په پورتني مثال کې، یو نوی بلاک اختیار د 0 ملیسیکنډونو د وخت پای سره مشخص شوی دی (دا پدې مانا ده چې د نامعلوم وخت انتظار کول). برسېره پردې، د مای سټریم سټریم لپاره د معمول پیژندونکي د تیرولو پرځای، یو ځانګړی پیژندونکی $ تیر شو. دا ځانګړی پیژندونکی پدې معنی دی XREAD باید په mystream کې د پیژندونکي په توګه اعظمي پیژندونکی وکاروئ. نو موږ به یوازې د هغه وخت څخه نوي پیغامونه ترلاسه کړو چې موږ یې اوریدل پیل کړل. په ځینو لارو کې دا د یونیکس "tail -f" کمانډ سره ورته دی.

په یاد ولرئ کله چې د بلاک انتخاب کاروئ موږ اړتیا نلرو چې ځانګړي پیژندونکی $ وکاروو. موږ کولی شو په جریان کې موجود هر پیژندونکی وکاروو. که ټیم کولی شي زموږ غوښتنې سمدستي پرته له بلاک کولو خدمت وکړي ، نو دا به دا کار وکړي ، که نه نو دا به بلاک شي.

بندول 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

د دې اغیز ترلاسه کولو لپاره، ریډیس سټریم د مصرف کونکي ګروپ په نوم مفهوم کاروي. دا مفهوم د pseudo-subscriber سره ورته دی، کوم چې د جریان څخه ډاټا ترلاسه کوي، مګر په حقیقت کې د ډیری پیرودونکو لخوا په یوه ګروپ کې خدمت کیږي، ځینې تضمین چمتو کوي:

  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 - دا کمانډ پیرودونکي ته اجازه ورکوي چې پیغام په بریالیتوب سره پروسس شوی په نښه کړي

د مصرف کونکي ګروپ رامینځته کول

راځئ فرض کړو چې زما سټریم لا دمخه شتون لري. بیا د ګروپ جوړولو قومانده به داسې ښکاري:

> XGROUP CREATE mystream mygroup $
OK

کله چې یوه ډله جوړه کړئ، موږ باید یو پیژندونکی تیر کړو، له کوم څخه چې ډله به پیغامونه ترلاسه کړي. که موږ غواړو ټول نوي پیغامونه ترلاسه کړو، نو موږ کولی شو د ځانګړي پیژندونکي $ څخه کار واخلو (لکه څنګه چې زموږ پورته مثال کې). که تاسو د ځانګړي پیژندونکي پر ځای 0 مشخص کړئ، نو په موضوع کې ټول پیغامونه به ګروپ ته شتون ولري.

اوس چې ډله جوړه شوې، موږ کولی شو سمدلاسه د کمانډ په کارولو سره د پیغامونو لوستل پیل کړو XREADGROUP. دا امر ډیر ورته دی XREAD او د اختیاري بلاک اختیار ملاتړ کوي. په هرصورت، د 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"

پورته کمانډ په لاندې ډول لفظي لوستل کیږي:

"زه، سبسکرائبر الیس، د مای ګروپ غړی، غواړم د مای سټریم څخه یو پیغام ولولم چې مخکې هیڅکله چا ته نه و سپارل شوی."

هرکله چې یو پیرودونکی په ګروپ کې عملیات ترسره کوي، دا باید خپل نوم چمتو کړي، په ځانګړې توګه په ګروپ کې ځان وپیژني. په پورتنۍ کمانډ کې یو بل خورا مهم توضیحات شتون لري - ځانګړی پیژندونکی ">". دا ځانګړی پیژندونکی پیغامونه فلټر کوي، یوازې هغه یې پریږدي چې مخکې هیڅکله ندي سپارل شوي.

همدارنګه، په ځانګړو مواردو کې، تاسو کولی شئ یو اصلي پیژندونکی مشخص کړئ لکه 0 یا کوم بل معتبر پیژندونکی. په دې حالت کې امر XREADGROUP تاسو ته به د پیغامونو تاریخ د "انتقال" حالت سره بیرته درکړي کوم چې ټاکل شوي پیرودونکي (ایلس) ته سپارل شوي مګر د کمانډ په کارولو سره ندي منل شوي XACK.

موږ کولی شو دا چلند سمدلاسه د ID 0 مشخص کولو سره ازموینه وکړو ، پرته له اختیار څخه COUNT. موږ به په ساده ډول یو واحد پاتې پیغام وګورو، دا د مڼې پیغام دی:

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

باب، د مای ګروپ غړی، له دوو څخه زیات پیغامونه نه غوښتل. کمانډ یوازې د ځانګړي پیژندونکي له امله نه سپارل شوي پیغامونه راپوروي ">". لکه څنګه چې تاسو لیدلی شئ، "مڼه" پیغام به ښکاره نشي ځکه چې دا دمخه الیس ته سپارل شوی، نو باب "نارنج" او "سټرابیري" ترلاسه کوي.

په دې توګه، الیس، باب، او د ګروپ کوم بل پیرودونکي کولی شي د ورته جریان څخه مختلف پیغامونه ولولي. دوی کولی شي د دوی د غیر پروسس شوي پیغامونو تاریخ هم ولولي یا پیغامونه د پروسس شوي په توګه په نښه کړي.

په ذهن کې ساتلو لپاره یو څو شیان شتون لري:

  • هرڅومره ژر چې پیرودونکي پیغام د امر په توګه وګڼي 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}

د دې کمانډ په کارولو سره، موږ کولی شو یو "بهرنی" پیغام ترلاسه کړو چې لا تر اوسه د مالک په بدلولو سره پروسس شوی نه دی {صارف}. په هرصورت، موږ کولی شو لږ تر لږه بې کاره وخت {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 اختیار یوازې د پیغام IDs بیرته راستنیدو لپاره کارول کیدی شي. دا ګټور دی که تاسو د پیغام توضیحاتو سره علاقه نه لرئ او غواړئ د سیسټم فعالیت زیات کړئ.

د تحویلۍ کاونټر

کاونټر چې تاسو یې په محصول کې ګورئ 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 کاروئ، زاړه ریکارډونه په اتوماتيک ډول حذف کیږي کله چې دوی ټاکل شوي اوږدوالی ته ورسیږي، نو جریان یو ثابت اندازه لري. په هرصورت، په دې حالت کې شاخه کول په ریډیس حافظه کې په خورا اغیزمن ډول نه واقع کیږي. تاسو کولی شئ وضعیت په لاندې ډول ښه کړئ:

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

په پورته مثال کې ~ دلیل پدې معنی دی چې موږ اړتیا نلرو د جریان اوږدوالی یو ځانګړي ارزښت ته محدود کړو. زموږ په مثال کې، دا ممکن د 1000 څخه لوی یا مساوي وي (د مثال په توګه، 1000، 1010، یا 1030). موږ یوازې په واضح ډول مشخص کړل چې موږ غواړو زموږ جریان لږترلږه 1000 ریکارډونه ذخیره کړي. دا د ریډیس دننه د حافظې مدیریت خورا ډیر اغیزمن کوي.

یو جلا ټیم هم شتون لري XTRIM، کوم چې ورته کار کوي:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

دوامداره ذخیره کول او نقل کول

د ریډیس سټریم په غیر متناسب ډول د غلام نوډونو ته نقل شوی او فایلونو ته خوندي شوی لکه AOF (د ټولو ډیټا سنیپ شاټ) او RDB (د ټولو لیکلو عملیاتو لاګ). د مصرف کونکو ګروپونو ریاست تکرار هم ملاتړ کیږي. له همدې امله ، که چیرې یو پیغام په ماسټر نوډ کې د "انتقال" حالت کې وي ، نو په غلام نوډونو کې به دا پیغام ورته حالت ولري.

د جریان څخه د انفرادي عناصرو لرې کول

د پیغامونو ړنګولو لپاره ځانګړی قومانده شتون لري XDEL. کمانډ د تار نوم ترلاسه کوي وروسته د پیغام IDs له مینځه وړل کیږي:

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

کله چې دا کمانډ وکاروئ ، تاسو اړتیا لرئ په پام کې ونیسئ چې اصلي حافظه به سمدلاسه خوشې نشي.

صفر اوږدوالی جریان

د جریانونو او نورو ریډیس ډیټا جوړښتونو ترمینځ توپیر دا دی چې کله د ډیټا نور جوړښتونه نور په دوی کې عناصر نلري ، د اړخ اغیزې په توګه ، د ډیټا جوړښت پخپله له حافظې څخه لرې کیږي. نو، د مثال په توګه، ترتیب شوی سیټ به په بشپړه توګه لیرې شي کله چې د ZREM کال وروستی عنصر لیرې کړي. پرځای یې، تارونه اجازه لري چې په حافظه کې پاتې شي حتی پرته له دې چې دننه عناصر ولري.

پایلې

د ریډیس سټریم د پیغام دلالانو ، د پیغام کتارونو ، متحد لاګنګ ، او تاریخ ساتلو چیٹ سیسټمونو رامینځته کولو لپاره مثالی دی.

لکه څنګه چې ما یو ځل وویل نیکلوس ویرت، پروګرامونه د الګوریتم او ډیټا جوړښتونه دي، او ریډیس لا دمخه تاسو ته دواړه درکوي.

سرچینه: www.habr.com

Add a comment