Redis Stream - የመልእክት መላላኪያ ስርዓቶችዎ አስተማማኝነት እና ልኬት

Redis Stream - የመልእክት መላላኪያ ስርዓቶችዎ አስተማማኝነት እና ልኬት

Redis Stream በሬዲስ ውስጥ ከስሪት 5.0 ጋር የተዋወቀ አዲስ የአብስትራክት የውሂብ አይነት ነው።
በፅንሰ-ሀሳብ ፣ Redis Stream ምዝግቦችን ማከል የሚችሉበት ዝርዝር ነው። እያንዳንዱ ግቤት ልዩ መለያ አለው። በነባሪነት መታወቂያው በራስ-ሰር ይፈጠራል እና የጊዜ ማህተምን ያካትታል። ስለዚህ፣ በጊዜ ብዛት የመዝገብ መዝገቦችን መጠየቅ ወይም ወደ ዥረቱ እንደመጣ አዲስ መረጃ መቀበል ትችላለህ፣ ልክ እንደ ዩኒክስ "ጅራት -f" ትዕዛዝ የሎግ ፋይሉን አንብቦ አዲስ ውሂብ ሲጠብቅ በረዶ ይሆናል። ብዙ ደንበኞች እርስ በርስ ሳይጋጩ ፋይሎችን በአንድ ጊዜ ማንበብ እንደሚችሉ ሁሉ ብዙ ደንበኞች በአንድ ጊዜ ክር ማዳመጥ እንደሚችሉ ልብ ይበሉ።

የአዲሱን የመረጃ አይነት ሁሉንም ጥቅሞች ለመረዳት የRedis Streamን ተግባር በከፊል የሚደግሙትን የረዥም ጊዜ የRedis አወቃቀሮችን በፍጥነት እንመልከታቸው።

Redis PUB/SUB

Redis Pub/Sub በቁልፍ ዋጋ ማከማቻዎ ውስጥ አስቀድሞ የተሰራ ቀላል የመልእክት መላላኪያ ስርዓት ነው። ሆኖም፣ ቀላልነት ዋጋ ያስከፍላል፡-

  • አታሚው በሆነ ምክንያት ካልተሳካ ሁሉንም ተመዝጋቢዎቹን ያጣል።
  • አታሚው የሁሉም ተመዝጋቢዎቹን ትክክለኛ አድራሻ ማወቅ አለበት።
  • መረጃ ከተሰራው በበለጠ ፍጥነት ከታተመ አታሚ ተመዝጋቢዎቹን በስራ ላይ መጫን ይችላል።
  • ምን ያህል ተመዝጋቢዎች እንደደረሱ እና ይህን መልእክት በምን ያህል ፍጥነት ማካሄድ እንደቻሉ መልእክቱ ከታተመ በኋላ ወዲያውኑ ከአታሚው ቋት ይሰረዛል።
  • ሁሉም ተመዝጋቢዎች መልእክቱን በተመሳሳይ ጊዜ ይቀበላሉ. ተመዝጋቢዎች ራሳቸው በሆነ መንገድ ተመሳሳይ መልእክት በማስኬድ ቅደም ተከተል ላይ መስማማት አለባቸው።
  • ተመዝጋቢ መልእክትን በተሳካ ሁኔታ ማከናወኑን ለማረጋገጥ አብሮ የተሰራ ዘዴ የለም። አንድ የደንበኝነት ተመዝጋቢ መልእክት ከተቀበለ እና በሂደት ላይ እያለ ቢበላሽ አታሚው ስለእሱ አያውቅም።

Redis ዝርዝር

Redis List የንባብ ትዕዛዞችን ማገድን የሚደግፍ የውሂብ መዋቅር ነው. ከዝርዝሩ መጀመሪያ ወይም መጨረሻ ላይ መልዕክቶችን ማከል እና ማንበብ ይችላሉ. በዚህ መዋቅር ላይ በመመስረት ለተከፋፈለ ስርዓትዎ ጥሩ ቁልል ወይም ወረፋ ማድረግ ይችላሉ, እና በአብዛኛዎቹ ሁኔታዎች ይህ በቂ ይሆናል. ከRedis Pub/Sub ዋና ዋና ልዩነቶች፡-

  • መልእክቱ ለአንድ ደንበኛ ተላልፏል. የመጀመሪያው የተነበበ የታገደ ደንበኛ መጀመሪያ ውሂቡን ይቀበላል።
  • ክሊንት ለእያንዳንዱ መልእክት የንባብ ክዋኔውን በራሱ መጀመር አለበት። ዝርዝር ሾለ ደንበኞች ምንም አያውቅም።
  • አንድ ሰው እስኪያነብላቸው ወይም በግልፅ እስኪሰርዛቸው ድረስ መልእክቶች ይቀመጣሉ። መረጃን ወደ ዲስክ ለማፍሰስ የሬዲስ አገልጋይን ካዋቀሩት የስርዓቱ አስተማማኝነት በከፍተኛ ሁኔታ ይጨምራል።

የዥረት መግቢያ

ወደ ዥረት መግቢያ በማከል ላይ

ቡድን XADD ወደ ዥረቱ አዲስ ግቤት ይጨምራል። መዝገብ ሕብረቁምፊ ብቻ ሳይሆን አንድ ወይም ከዚያ በላይ የቁልፍ-እሴት ጥንዶችን ያካትታል። ስለዚህ፣ እያንዳንዱ ግቤት አስቀድሞ የተዋቀረ እና የCSV ፋይል መዋቅርን ይመስላል።

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

ከላይ ባለው ምሳሌ ውስጥ ሁለት መስኮችን በስም (ቁልፍ) "mystream": "sensor-id" እና "temperature" ከ "1234" እና "19.8" እሴቶች ጋር በቅደም ተከተል እንጨምራለን. እንደ ሁለተኛው ነጋሪ እሴት ፣ ትዕዛዙ ለመግቢያ የሚመደብ መለያ ይወስዳል - ይህ መለያ በዥረቱ ውስጥ ያለውን እያንዳንዱን ግቤት በልዩ ሁኔታ ይለያል። ሆኖም፣ በዚህ አጋጣሚ * አልፈናል ምክንያቱም Redis አዲስ መታወቂያ እንዲያፈልቅልን እንፈልጋለን። እያንዳንዱ አዲስ መታወቂያ ይጨምራል። ስለዚህ፣ እያንዳንዱ አዲስ ግቤት ከቀደምት ግቤቶች አንጻር ከፍ ያለ መለያ ይኖረዋል።

መለያ ቅርጸት

የመግቢያ መታወቂያው በትእዛዙ ተመልሷል XADDሁለት ክፍሎችን ያቀፈ ነው-

{millisecondsTime}-{sequenceNumber}

ሚሊሰከንዶች ጊዜ - የዩኒክስ ጊዜ በሚሊሰከንዶች (የሬዲስ አገልጋይ ጊዜ)። ነገር ግን፣ አሁን ያለው ጊዜ ከቀዳሚው ቀረጻ ጊዜ ጋር ተመሳሳይ ወይም ያነሰ ከሆነ፣ የቀደመው ቀረጻ የጊዜ ማህተም ጥቅም ላይ ይውላል። ስለዚህ፣ የአገልጋዩ ጊዜ ወደ ኋላ ከተመለሰ፣ አዲሱ ለዪ አሁንም የመጨመር ንብረቱን እንደያዘ ይቆያል።

ቅደም ተከተል ቁጥር በተመሳሳይ ሚሊሰከንድ ውስጥ ለተፈጠሩ መዝገቦች ጥቅም ላይ ይውላል. ቅደም ተከተል ቁጥር ከቀዳሚው ግቤት ጋር ሲነጻጸር በ 1 ይጨምራል. ምክንያቱም ቅደም ተከተል ቁጥር መጠኑ 64 ቢት ነው፣ ከዚያ በተግባር በአንድ ሚሊሰከንድ ውስጥ ሊፈጠሩ በሚችሉ መዝገቦች ብዛት ላይ ገደብ ውስጥ መግባት የለብዎትም።

የእንደዚህ አይነት መለያዎች ቅርጸት በመጀመሪያ እይታ እንግዳ ሊመስል ይችላል። እምነት የጎደለው አንባቢ ለምን ጊዜ የመለያው አካል እንደሆነ ሊያስብ ይችላል። ምክንያቱ Redis ዥረቶች የክልል መጠይቆችን በመታወቂያ ይደግፋሉ። መለያው መዝገቡ ከተፈጠረበት ጊዜ ጋር የተቆራኘ ስለሆነ፣ ይህ የጊዜ ክልሎችን ለመጠየቅ ያስችላል። ትዕዛዙን ስንመለከት አንድ የተለየ ምሳሌ እንመለከታለን XRANGE.

በሆነ ምክንያት ተጠቃሚው የራሱን መለያ መግለጽ ከፈለገ ለምሳሌ ከአንዳንድ ውጫዊ ስርዓቶች ጋር የተቆራኘ ከሆነ ወደ ትዕዛዙ ማስተላለፍ እንችላለን XADD ከዚህ በታች እንደሚታየው በ* ምትክ፡-

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

እባክዎ በዚህ ሁኔታ የመታወቂያውን ጭማሪ እራስዎ መከታተል እንዳለብዎ ልብ ይበሉ። በእኛ ምሳሌ፣ ትንሹ መለያ "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 መዝገቦችን (ገጽታ) ማግኘት ከፈለግን, የመጨረሻውን የተቀበለው መታወቂያ መጠቀም እንችላለን, ጨምር ቅደም ተከተል ቁጥር በአንድ እና እንደገና ይጠይቁ. ይህንን በሚከተለው ምሳሌ እንመልከተው። በ 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"

በሚቀጥሉት ሁለት አካላት መደጋገምን ለመቀጠል፣ የተቀበለውን የመጨረሻ መታወቂያ ማለትም 1519073279157-0 መምረጥ እና 1 ማከል አለብን። ቅደም ተከተል ቁጥር.
የተገኘው መታወቂያ፣ በዚህ አጋጣሚ 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(ሎግ(N)) ለመፈለግ እና O(M) ኤም ኤለመንቶችን ለመመለስ ነው፣ ከዚያ እያንዳንዱ የመድገም እርምጃ ፈጣን ነው። ስለዚህ, በመጠቀም XRANGE ጅረቶች በብቃት ሊደገሙ ይችላሉ።

ቡድን XREVRANGE እኩል ነው። XRANGEነገር ግን ንጥረ ነገሮቹን በተገላቢጦሽ ይመልሳል፡-

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

እባክዎን ትዕዛዙን ያስተውሉ XREVRANGE ይወስዳል የክልል ነጋሪ እሴቶች በተቃራኒ ቅደም ተከተል ይጀምራሉ እና ይቆማሉ።

XREAD በመጠቀም አዲስ ግቤቶችን በማንበብ ላይ

ብዙ ጊዜ ስራው የሚፈጠረው ለዥረት መመዝገብ እና አዲስ መልዕክቶችን መቀበል ነው። ይህ ፅንሰ-ሀሳብ ከRedis Pub/Sub ወይም Redis Listን ከመከልከል ጋር ተመሳሳይ ሊመስል ይችላል፣ነገር ግን Redis Streamን እንዴት መጠቀም እንደሚቻል መሰረታዊ ልዩነቶች አሉ።

  1. እያንዳንዱ አዲስ መልእክት በነባሪነት ለእያንዳንዱ ተመዝጋቢ ይደርሳል። ይህ ባህሪ አዲስ መልእክት በአንድ ተመዝጋቢ ብቻ የሚነበብበት ሬዲስ ዝርዝርን ከማገድ የተለየ ነው።
  2. በሬዲስ ፐብ/ንኡስ ክፍል ውስጥ ሁሉም መልዕክቶች የተረሱ እና ፈጽሞ የማይቀጥሉ ሲሆኑ፣ በዥረት ውስጥ ሁሉም መልዕክቶች ላልተወሰነ ጊዜ ይቆያሉ (ደንበኛው በግልፅ መሰረዝን ካላመጣ በስተቀር)።
  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 ሚሊሰከንዶች ጊዜ አልፎበታል (ይህ ማለት ላልተወሰነ ጊዜ መጠበቅ ማለት ነው)። በተጨማሪም፣ ለዥረቱ ማይዥረት የተለመደውን መለያ ከማለፍ ይልቅ፣ ልዩ መለያ $ ታልፏል። ይህ ልዩ መለያ ማለት ነው። XREAD ከፍተኛውን ለዪ mystream እንደ መለያው መጠቀም አለበት። ስለዚህ አዲስ መልእክት የምንደርሰው ማዳመጥ ከጀመርንበት ጊዜ ጀምሮ ብቻ ነው። በአንዳንድ መንገዶች ይህ ከዩኒክስ "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"

ከላይ ያለው ትዕዛዝ በቃላት እንደሚከተለው ይነበባል፡-

"እኔ የደንበኝነት ተመዝጋቢ አሊስ፣የየእኔ ቡድን አባል፣ከዚህ በፊት ለማንም ያልደረሰ አንድ መልእክት ከየእኔ ዥረት ማንበብ እፈልጋለሁ።"

አንድ የደንበኝነት ተመዝጋቢ በቡድን ላይ አንድ ቀዶ ጥገና ባደረገ ቁጥር ስሙን መስጠት አለበት, በቡድኑ ውስጥ እራሱን ለይቶ ማወቅ. ከላይ ባለው ትዕዛዝ ውስጥ አንድ ተጨማሪ በጣም አስፈላጊ ዝርዝር አለ - ልዩ መለያ ">". ይህ ልዩ መለያ መልዕክቶችን ያጣራል፣ ከዚህ በፊት ያልደረሱትን ብቻ ይተወዋል።

እንዲሁም፣ በልዩ ሁኔታዎች፣ እንደ 0 ወይም ሌላ ማንኛውም ትክክለኛ ለዪ ያለ እውነተኛ ለዪን መግለጽ ይችላሉ። በዚህ ጉዳይ ላይ ትእዛዝ XREADGROUP ለተጠቀሰው የደንበኝነት ተመዝጋቢ (አሊስ) የተላኩ ነገር ግን ትዕዛዙን ተጠቅመው እስካሁን እውቅና ያልተሰጣቸው የ"በመጠባበቅ" ሁኔታ ያላቸውን የመልእክት ታሪክ ይመልስልዎታል። XACK.

ያለአማራጭ መታወቂያ 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 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} - የማድረስ ሙከራዎች ብዛት
{consumer-name} - የቡድን ስም

> 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

አሁን ለእያንዳንዱ መልእክት ዝርዝሮች አሉን መታወቂያ ፣ የተመዝጋቢ ስም ፣ የስራ ፈት ጊዜ በሚሊሰከንዶች እና በመጨረሻም የማድረስ ሙከራዎች ብዛት። ከቦብ ሁለት መልዕክቶች አሉን እና ለ 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} በመቀየር ገና ያልተሰራ "የውጭ" መልእክት መቀበል እንችላለን። ነገር ግን፣ አነስተኛ የስራ ፈት ጊዜ {ደቂቃ-ስራ ፈት ጊዜ}ንም ማቅረብ እንችላለን። ይህ ሁለት ደንበኞች የተመሳሳይ መልዕክቶችን ባለቤት በአንድ ጊዜ ለመለወጥ የሚሞክሩበትን ሁኔታ ለማስወገድ ይረዳል፡-

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 አማራጭ የመልእክት መታወቂያዎችን ለመመለስ ብቻ ሊያገለግል ይችላል። ለመልእክቱ ዝርዝሮች ፍላጎት ከሌለዎት እና የስርዓት አፈፃፀምን ለመጨመር ከፈለጉ ይህ ጠቃሚ ነው።

የመላኪያ ቆጣሪ

በውጤቱ ውስጥ የሚያዩት ቆጣሪ ማደግ የእያንዳንዱ መልእክት የማድረስ ብዛት ነው። እንዲህ ዓይነቱ ቆጣሪ በሁለት መንገድ ይጨምራል፡ መልእክት በተሳካ ሁኔታ በ በኩል ሲጠየቅ 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. ትዕዛዙ የሚሰረዙትን የመልእክት መታወቂያዎች ተከትሎ የክርን ስም ያገኛል፡-

> 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 ጥሪ የመጨረሻውን አካል ሲያስወግድ የተደረደረው ስብስብ ሙሉ በሙሉ ይወገዳል. በምትኩ፣ ክሮች በውስጣቸው ምንም ንጥረ ነገር ሳይኖራቸው እንኳን በማህደረ ትውስታ ውስጥ እንዲቆዩ ተፈቅዶላቸዋል።

መደምደሚያ

ሬዲስ ዥረት የመልእክት ደላላዎችን፣ የመልእክት ወረፋዎችን፣ የተዋሃደ ምዝግብ ማስታወሻዎችን እና ታሪክን ለመጠበቅ የውይይት ስርዓቶችን ለመፍጠር ተስማሚ ነው።

አንድ ጊዜ እንዳልኩት Niklaus Wirth, ፕሮግራሞች ስልተ ቀመሮች እና የውሂብ አወቃቀሮች ናቸው, እና Redis አስቀድሞ ሁለቱንም ይሰጥዎታል.

ምንጭ: hab.com

አስተያየት ያክሉ