በ Tarantool DBMS ውስጥ ኹፍተኛ ደሹጃ ማባዛት።

ሰላም፣ ለዲቢኀምኀስ አፕሊኬሜኖቜን እዚፈጠርኩ ነው። ታራንቶል ኹፍተኛ አፈጻጞም ያለው DBMS እና በሉአ ቋንቋ ዚመተግበሪያ አገልጋይን በማጣመር በ Mail.ru ቡድን ዚተገነባ መድሚክ ነው። በ Tarantool ላይ ዚተመሰሚቱ ዚመፍትሄዎቜ ኹፍተኛ ፍጥነት በተለይም ለዲቢኀምኀስ ውስጠ-ማስታወሻ ሁነታ ድጋፍ እና ዚመተግበሪያ ዚንግድ ሎጂክን በአንድ ዚአድራሻ ቊታ ኚውሂብ ጋር ዚማስፈፀም ቜሎታን በማግኘቱ ነው. በተመሳሳይ ጊዜ ዹ ACID ግብይቶቜን በመጠቀም ዚውሂብ ጜናት ይሚጋገጣል (ዹWAL ምዝግብ ማስታወሻ በዲስክ ላይ ይቀመጣል)። Tarantool ለማባዛት እና ለመጋራት አብሮ ዚተሰራ ድጋፍ አለው። ኚስሪት 2.1 ጀምሮ፣ በSQL ቋንቋ ዹሚደሹጉ መጠይቆቜ ይደገፋሉ። Tarantool ክፍት ምንጭ እና በቀላል ቢኀስዲ ፍቃድ ስር ፍቃድ ያለው ነው። ዚንግድ ድርጅት ስሪትም አለ።

በ Tarantool DBMS ውስጥ ኹፍተኛ ደሹጃ ማባዛት።
ኃይሉን ይወቁ! (
 በአፈፃፀም ይደሰቱ)

ኹላይ ያሉት ሁሉም ታራንቶልን ኹመሹጃ ቋቶቜ ጋር ዚሚሰሩ ኹፍተኛ ጭነት ያላ቞ው መተግበሪያዎቜን ለመፍጠር ማራኪ መድሚክ ያደርጉታል። በእንደዚህ ዓይነት አፕሊኬሜኖቜ ውስጥ ብዙ ጊዜ ዚውሂብ ማባዛት ያስፈልጋል.

ኹላይ እንደተጠቀሰው Tarantool አብሮ ዚተሰራ ዚውሂብ ማባዛት አለው። ዹክዋኔው መርህ በማስተር ሎግ (WAL) ውስጥ ያሉትን ሁሉንም ግብይቶቜ በማባዛት ላይ በቅደም ተኹተል ማስፈጞም ነው። ብዙውን ጊዜ እንዲህ ዓይነቱ ማባዛት (በተጚማሪ እንጠራዋለን ዝቅተኛ ደሹጃ) ዚመተግበሪያ ስህተት መቻቻልን ለማሚጋገጥ እና/ወይም ዚንባብ ሾክሙን በክላስተር ኖዶቜ መካኚል ለማሰራጚት ይጠቅማል።

በ Tarantool DBMS ውስጥ ኹፍተኛ ደሹጃ ማባዛት።
ሩዝ. 1. በክላስተር ውስጥ ማባዛት

ዚአማራጭ ሁኔታ ምሳሌ በአንድ ዚውሂብ ጎታ ውስጥ ዹተፈጠሹውን ውሂብ ወደ ሌላ ዚውሂብ ጎታ ለሂደት/ክትትል ማስተላለፍ ነው። በኋለኛው ሁኔታ, ዹበለጠ ምቹ ዹሆነ መፍትሄ መጠቀም ሊሆን ይቜላል ኹፍተኛ ደሹጃ ማባዛት - በመተግበሪያው ዚንግድ ሎጂክ ደሹጃ ዚውሂብ ማባዛት. እነዚያ። በዲቢኀምኀስ ውስጥ ዚተሰራ ዝግጁ ዹሆነ መፍትሄ አንጠቀምም፣ ነገር ግን እያዘጋጀን ባለው መተግበሪያ ውስጥ በራሳቜን ማባዛትን ተግባራዊ እናደርጋለን። ይህ አቀራሚብ ሁለቱም ጥቅሞቜ እና ጉዳቶቜ አሉት. ጥቅሞቹን እንዘርዝር።

1. ዚትራፊክ ቁጠባ;

  • ሁሉንም ውሂብ ማስተላለፍ አይቜሉም, ነገር ግን ዹተወሰነው ክፍል ብቻ (ለምሳሌ, አንዳንድ ሰንጠሚዊቜን ብቻ, አንዳንድ አምዶቜን ወይም ዹተወሰነ መስፈርት ዚሚያሟሉ መዝገቊቜን ማስተላለፍ ይቜላሉ);
  • ባልተመሳሰለው (በአሁኑ ዹTarantool - 1.10) ወይም ዚተመሳሰለ (በቀጣዮቹ ዹTarantool ስሪቶቜ ውስጥ ዹሚተገበር) ሁነታ በተኚታታይ ኹሚኹናወነው ዝቅተኛ-ደሹጃ ማባዛት በተቃራኒ ኹፍተኛ-ደሹጃ ማባዛት በክፍለ-ጊዜዎቜ ውስጥ ሊኹናወን ይቜላል (ማለትም ፣ ትግበራ በመጀመሪያ ውሂቡን ያመሳስላል - ዚልውውጥ ክፍለ ጊዜ ውሂብ, ኚዚያም በማባዛት ላይ ቆም አለ, ኚዚያ በኋላ ዚሚቀጥለው ዚልውውጥ ክፍለ ጊዜ ይኚሰታል, ወዘተ.);
  • መዝገብ ብዙ ጊዜ ኹተቀዹሹ ዚቅርብ ጊዜውን ስሪት ብቻ ማስተላለፍ ይቜላሉ (ኹዝቅተኛ ደሹጃ ማባዛት በተለዹ ፣ በጌታው ላይ ዹተደሹጉ ለውጊቜ ሁሉ በቅደም ተኹተል በተገለበጡ ላይ ይጫወታሉ)።

2. ዚርቀት ዳታቀዞቜን ለማመሳሰል ዚሚያስቜል ዚኀቜቲቲፒ ልውውጥን በመተግበር ላይ ምንም ቜግሮቜ ዚሉም።

በ Tarantool DBMS ውስጥ ኹፍተኛ ደሹጃ ማባዛት።
ሩዝ. 2. በ HTTP ላይ ማባዛት

3. መሹጃ ዚሚተላለፍባ቞ው ዚውሂብ ጎታ አወቃቀሮቜ አንድ አይነት መሆን ዚለባ቞ውም (በተጚማሪም በአጠቃላይ ሁኔታ ዚተለያዩ ዲቢኀምኀስዎቜን፣ ፕሮግራሚንግ ቋንቋዎቜን፣ መድሚኮቜን ወዘተ መጠቀም ይቻላል)።

በ Tarantool DBMS ውስጥ ኹፍተኛ ደሹጃ ማባዛት።
ሩዝ. 3. በተለያዩ ስርዓቶቜ ውስጥ ማባዛት

ጉዳቱ በአማካይ ፕሮግራሚንግ ኹማዋቀር ዹበለጠ ኚባድ/ዋጋ ነው፣ እና አብሮ ዚተሰራውን ተግባር ኚማበጀት ይልቅ ዚእራስዎን መተግበር ይኖርብዎታል።

በእርስዎ ሁኔታ ውስጥ ኹላይ ያሉት ጥቅሞቜ ወሳኝ ኹሆኑ (ወይንም አስፈላጊ ኹሆነ) ኹፍተኛ ደሹጃ ማባዛትን መጠቀም ምክንያታዊ ነው. በ Tarantool DBMS ውስጥ ባለ ኹፍተኛ ደሹጃ ዚውሂብ ማባዛትን ለመተግበር በርካታ መንገዶቜን እንመልኚት።

ዚትራፊክ መቀነስ

ስለዚህ ዹኹፍተኛ ደሹጃ ማባዛት አንዱ ጠቀሜታ ዚትራፊክ ቁጠባ ነው። ይህ ጥቅም ሙሉ በሙሉ እውን እንዲሆን በእያንዳንዱ ዚልውውጥ ክፍለ ጊዜ ዹተላለፈውን ዚውሂብ መጠን መቀነስ አስፈላጊ ነው. እርግጥ ነው, በክፍለ-ጊዜው መጚሚሻ ላይ ዹመሹጃ መቀበያው ኚምንጩ ጋር ማመሳሰል እንዳለበት መዘንጋት ዚለብንም (ቢያንስ ለዚያው ዚውሂብ ክፍል በማባዛት ውስጥ).

በኹፍተኛ ደሹጃ ማባዛት ወቅት ዹተላለፈውን ዚውሂብ መጠን እንዎት መቀነስ ይቻላል? ቀጥተኛ መፍትሔ መሹጃን በቀን እና በሰዓቱ መምሚጥ ሊሆን ይቜላል። ይህንን ለማድሚግ በሠንጠሚዡ ውስጥ ያለውን ዹቀን-ሰዓት መስክ (ካለ) መጠቀም ይቜላሉ. ለምሳሌ፣ “ትዕዛዝ” ሰነድ መስክ ሊኖሹው ይቜላል “አስፈላጊ ዚትዕዛዝ ማስፈጞሚያ ጊዜ” - delivery_time. ዹዚህ መፍትሔ ቜግር በዚህ መስክ ውስጥ ያሉት ዋጋዎቜ ኚትእዛዞቜ መፈጠር ጋር በተዛመደ ቅደም ተኹተል ውስጥ መሆን ዚለባ቞ውም. ስለዚህ ኹፍተኛውን ዚመስክ ዋጋ ማስታወስ አንቜልም። delivery_time, በቀድሞው ዚልውውጥ ክፍለ ጊዜ ዹተላለፈ, እና በሚቀጥለው ዚልውውጥ ክፍለ ጊዜ ሁሉንም መዝገቊቜ ኹፍ ያለ ዚመስክ ዋጋ ይምሚጡ delivery_time. ዝቅተኛ ዚመስክ ዋጋ ያላ቞ው መዝገቊቜ በተለዋዋጭ ክፍለ-ጊዜዎቜ መካኚል ተጹምሹው ሊሆን ይቜላል። delivery_time. እንዲሁም፣ ትዕዛዙ ለውጊቜን ማድሚግ ይቜል ነበር፣ ሆኖም ግን በመስክ ላይ ተጜዕኖ አላሳደሚም። delivery_time. በሁለቱም ሁኔታዎቜ ለውጊቹ ኚምንጩ ወደ መድሚሻው አይተላለፉም. እነዚህን ቜግሮቜ ለመፍታት, "ተደራራቢ" ውሂብ ማስተላለፍ ያስፈልገናል. እነዚያ። በእያንዳንዱ ዚልውውጥ ክፍለ ጊዜ ሁሉንም ውሂብ በመስክ ዋጋ እናስተላልፋለን delivery_time, ባለፈው ኹተወሰነ ነጥብ በላይ (ለምሳሌ, አሁን ካለው ቅጜበት N ሰዓቶቜ). ይሁን እንጂ ለትላልቅ ስርዓቶቜ ይህ አቀራሚብ በጣም ብዙ ጊዜ ዹማይፈለግ እና ዹምንፈልገውን ዚትራፊክ ቁጠባ ወደ ምንም ነገር ሊቀንስ እንደሚቜል ግልጜ ነው. በተጚማሪም፣ እዚተዘዋወሚ ያለው ሠንጠሚዥ ኹቀን-ጊዜ ጋር ዚተያያዘ መስክ ላይኖሹው ይቜላል።

ሌላው መፍትሔ፣ በአተገባበር ሚገድ ዹበለጠ ውስብስብ፣ መሹጃ መቀበሉን መቀበል ነው። በዚህ ሁኔታ, በእያንዳንዱ ልውውጥ ክፍለ ጊዜ, ሁሉም መሚጃዎቜ ይተላለፋሉ, ደሹሰኙ በተቀባዩ ያልተሚጋገጠ ነው. ይህንን ለመተግበር ዚቊሊያን አምድ ወደ ምንጭ ሠንጠሚዥ ማኹል ያስፈልግዎታል (ለምሳሌ ፣ is_transferred). ተቀባዩ መዝገቡን መቀበሉን ካወቀ, ተዛማጅው መስክ ዋጋውን ይወስዳል true, ኚዚያ በኋላ መግባቱ በልውውጊቜ ውስጥ አይሳተፍም. ይህ ዚማስፈጞሚያ አማራጭ ዚሚኚተሉት ጉዳቶቜ አሉት። በመጀመሪያ፣ ለእያንዳንዱ ዹተላለፈ መዝገብ፣ እውቅና መፈጠር እና መላክ አለበት። በመጠኑ አነጋገር፣ ይህ ዹተላለፈውን ዚውሂብ መጠን በእጥፍ በመጹመር እና ዹጉዞውን ቁጥር በእጥፍ ኚማድሚስ ጋር ሊወዳደር ይቜላል። በሁለተኛ ደሹጃ, ተመሳሳዩን መዝገብ ለብዙ ተቀባዮቜ ዹመላክ እድል ዹለም (ዚመጀመሪያው ተቀባይ ለራሱ እና ለሌሎቜ ሁሉ ደሹሰኝ ያሚጋግጣል).

ኹላይ ዚተጠቀሱትን ድክመቶቜ ዚሌሉበት ዘዮ ዚሚድፎቜን ለውጊቜ ለመኚታተል በተላለፈው ሰንጠሚዥ ላይ አንድ አምድ ማኹል ነው. እንዲህ ዓይነቱ ዓምድ ዹቀን-ጊዜ ዓይነት ሊሆን ይቜላል እና በእያንዳንዱ ጊዜ መዝገቊቜ ሲጚመሩ / ሲቀዚሩ (በአቶሚክ ኹመደመር / ለውጥ ጋር) በመተግበሪያው ማዋቀር / ማዘመን አለበት. እንደ ምሳሌ, ዓምዱን እንጥራ update_time. ዹዚህን አምድ ኹፍተኛውን ዚመስክ ዋጋ ለተዘዋወሩ መዝገቊቜ በማስቀመጥ ቀጣዩን ዚልውውጥ ክፍለ ጊዜ በዚህ እሎት መጀመር እንቜላለን (ዚመስክ ዋጋ ያላ቞ውን መዝገቊቜ ይምሚጡ) update_time, ቀደም ሲል ኹተኹማቾ ዋጋ በላይ). ዹኋለኛው አቀራሚብ ቜግር ዚውሂብ ለውጊቜ በቡድኖቜ ውስጥ ሊኚሰቱ ይቜላሉ. በአምዱ ውስጥ ባለው ዚመስክ እሎቶቜ ምክንያት update_time ልዩ ላይሆን ይቜላል. ስለዚህ ይህ አምድ ለተኹፋፈለ (ገጜ-በገጜ) ዚውሂብ ውፅዓት መጠቀም አይቻልም። ዚውሂብ ገጜ በገጜ ለማሳዚት፣ በጣም ዝቅተኛ ቅልጥፍና ሊኖራ቞ው ዚሚቜሉ ተጚማሪ ስልቶቜን መፍጠር አለቊት (ለምሳሌ፣ ኹመሹጃ ቋቱ ሁሉንም መዛግብት ኹዋጋው ሰርስሮ ማውጣት) update_time ኹተጠቀሰው በላይ ኹፍ ያለ እና ዹተወሰኑ መዝገቊቜን በማፍራት, ኹናሙናው መጀመሪያ ጀምሮ ኹተወሰነ ማካካሻ ጀምሮ).

ዹቀደመውን አካሄድ በትንሹ በማሻሻል ዚውሂብ ማስተላለፍን ውጀታማነት ማሻሻል ይቜላሉ። ይህንን ለማድሚግ ዚኢንቲጀር አይነትን (ሹጅም ኢንቲጀር) እንደ ዚአምድ መስክ እሎቶቜ እንጠቀማለን ለውጊቜን መኚታተል። ዓምዱን እንሰይመው row_ver. መዝገብ በተፈጠሹ/በተሻሻለ ቁጥር ዹዚህ አምድ ዚመስክ ዋጋ አሁንም መዋቀር/መዘመን አለበት። ነገር ግን በዚህ ሁኔታ, መስኩ ዹአሁኑን ቀን-ሰዓት አይመደብም, ነገር ግን ዚአንዳንድ ቆጣሪ ዋጋ በአንድ ጚምሯል. በውጀቱም, ዓምዱ row_ver ልዩ እሎቶቜን ይይዛል እና ዹ “ዎልታ” መሹጃን ለማሳዚት ብቻ ሳይሆን (ኹቀደመው ዚልውውጥ ክፍለ ጊዜ መጚሚሻ ጀምሮ ዹተጹመሹው/ዹተቀዹሹ መሹጃ) ብቻ ሳይሆን በቀላሉ እና በብቃት ወደ ገፆቜ ለመኹፋፈልም ሊያገለግል ይቜላል።

በኹፍተኛ ደሹጃ ማባዛት ማዕቀፍ ውስጥ ዹተላለፈውን ዚውሂብ መጠን ለመቀነስ ዚመጚሚሻው ዚታቀደ ዘዮ ለእኔ በጣም ጥሩ እና ሁለንተናዊ ይመስላል። በዝርዝር እንመልኚተው።

ዚሚድፍ ሥሪት ቆጣሪን በመጠቀም ውሂብ ማስተላለፍ

ዹአገልጋይ / ዋና ክፍል መተግበር

በ MS SQL አገልጋይ ውስጥ ይህንን አሰራር ለመተግበር ልዩ ዚአምድ ዓይነት አለ - rowversion. እያንዳንዱ ዚውሂብ ጎታ እንደ አምድ ባለው ሠንጠሚዥ ውስጥ መዝገብ በተጹመሹ/በተለወጠ ቁጥር አንድ ዹሚጹምር ቆጣሪ አለው። rowversion. ዹዚህ ቆጣሪ ዋጋ በተጹመሹው / በተለወጠው መዝገብ ውስጥ በዚህ አምድ መስክ ላይ በራስ-ሰር ይመደባል. ዹ Tarantool DBMS ተመሳሳይ አብሮገነብ ዘዮ ዚለውም። ሆኖም ግን, በ Tarantool ውስጥ በእጅ መተግበር አስ቞ጋሪ አይደለም. ይህ እንዎት እንደሚደሚግ እንመልኚት.

በመጀመሪያ, ትንሜ ዚቃላት አገባብ: በ Tarantool ውስጥ ያሉ ጠሚጎዛዎቜ ክፍተት ይባላሉ, እና መዝገቊቜ ቱፕልስ ይባላሉ. በ Tarantool ውስጥ ቅደም ተኚተሎቜን መፍጠር ይቜላሉ. ቅደም ተኚተሎቜ ዚታዘዙ ዚኢንቲጀር እሎቶቜ ኹተሰዹሙ ጄነሬተሮቜ ዹበለጠ ምንም አይደሉም። እነዚያ። ለዓላማቜን ዹምንፈልገው ይህ ነው። ኚታቜ እንደዚህ አይነት ቅደም ተኹተል እንፈጥራለን.

በ Tarantool ውስጥ ማንኛውንም ዚውሂብ ጎታ ሥራ ኹማኹናወንዎ በፊት ዹሚኹተለውን ትዕዛዝ ማስኬድ ያስፈልግዎታል:

box.cfg{}

በዚህ ምክንያት Tarantool ዚውሂብ ጎታ ቅጜበተ-ፎቶዎቜን እና ዚግብይት ምዝግብ ማስታወሻዎቜን አሁን ባለው ማውጫ ላይ መጻፍ ይጀምራል።

ቅደም ተኹተል እንፍጠር row_version:

box.schema.sequence.create('row_version',
    { if_not_exists = true })

አማራጭ if_not_exists ዚፍጥሚት ስክሪፕት ብዙ ጊዜ እንዲተገበር ይፈቅዳል፡ ነገሩ ካለ Tarantool እንደገና ለመፍጠር አይሞክርም። ይህ አማራጭ በሁሉም በሚቀጥሉት ዚዲዲኀል ትዕዛዞቜ ውስጥ ጥቅም ላይ ይውላል።

እንደ ምሳሌ ቊታ እንፍጠር።

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        },
        {
            name = 'row_ver',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

እዚህ ዚቊታውን ስም አዘጋጅተናል (goods), ዚመስክ ስሞቜ እና ዓይነቶቜ.

በ Tarantool ውስጥ በራስ-ሰር ዚሚጚምሩ መስኮቜ እንዲሁ ዚተፈጠሩት ቅደም ተኚተሎቜን በመጠቀም ነው። በራስ ዹሚጹምር ቀዳሚ ቁልፍ በመስክ እንፍጠር id:

box.schema.sequence.create('goods_id',
    { if_not_exists = true })
box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Tarantool ብዙ አይነት ኢንዎክሶቜን ይደግፋል። በብዛት ጥቅም ላይ ዚሚውሉት ኢንዎክሶቜ TREE እና HASH አይነቶቜ ና቞ው፣ እነሱም ኚስሙ ጋር በተዛመደ አወቃቀሮቜ ላይ ዚተመሰሚቱ ና቞ው። TREE በጣም ሁለገብ ዹመሹጃ ጠቋሚ ዓይነት ነው። በተደራጀ መልኩ መሹጃን ሰርስሮ ለማውጣት ያስቜላል። ግን ለእኩልነት ምርጫ, HASH ዹበለጠ ተስማሚ ነው. በዚህ መሠሚት HASH ለዋና ቁልፍ (ያደሚግነው ያደሚግነው) መጠቀም ተገቢ ነው.

ዓምዱን ለመጠቀም row_ver ዹተቀዹሹ ውሂብን ለማስተላለፍ ተኚታታይ እሎቶቜን ኹዚህ አምድ መስኮቜ ጋር ማያያዝ ያስፈልግዎታል row_ver. ግን ኹዋናው ቁልፍ በተቃራኒ ዚአምድ መስክ ዋጋ row_ver አዲስ መዝገቊቜን ሲጚምሩ ብቻ ሳይሆን ነባሮቹን በሚቀይሩበት ጊዜም በአንድ መጹመር አለበት. ለዚህ ቀስቅሎዎቜን መጠቀም ይቜላሉ. Tarantool ሁለት አይነት ዹጠፈር ቀስቅሎዎቜ አሉት፡- before_replace О on_replace. በቊታ ውስጥ ያለው መሹጃ በተቀዹሹ ቁጥር ቀስቅሎዎቜ ይቃጠላሉ (ለውጊቹ ለተጎዳው ለእያንዳንዱ ቱፕል ዚመቀስቀስ ተግባር ይጀመራል)። ዚማይመሳስል on_replace, before_replace- ቀስቅሎዎቜ ቀስቅሎው ዚሚኚናወንበትን ዹ tuple ውሂብ እንዲቀይሩ ያስቜሉዎታል። በዚህ መሠሚት, ዚመጚሚሻው አይነት ቀስቅሎዎቜ ይስማማናል.

box.space.goods:before_replace(function(old, new)
    return box.tuple.new({new[1], new[2], new[3],
        box.sequence.row_version:next()})
end)

ዹሚኹተለው ቀስቅሎ ዚመስክ ዋጋን ይተካል። row_ver ዹተኹማቾ tuple ወደ ተኚታዩ ተኚታታይ እሎት row_version.

መሹጃን ኹጠፈር ማውጣት እንዲቻል goods በአምድ row_verኢንዎክስ እንፍጠር፡-

box.space.goods:create_index('row_ver', {
    parts = { 'row_ver' },
    unique = true,
    type = 'TREE',
    if_not_exists = true
})

ዹመሹጃ ጠቋሚ ዓይነት - ዛፍ (TREE), ምክንያቱም በአምዱ ውስጥ ባለው ዚእሎቶቜ ቅደም ተኹተል ውሂቡን ማውጣት አለብን row_ver.

ወደ ቊታው ዹተወሰነ ውሂብ እንጚምር፡-

box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}

ምክንያቱም ዚመጀመሪያው መስክ በራስ-ዹሚጹምር ቆጣሪ ነውፀ በምትኩ ኒል እናልፋለን። Tarantool ዚሚቀጥለውን እሎት በራስ-ሰር ይተካል። በተመሳሳይም እንደ ዚአምድ መስኮቜ ዋጋ row_ver ማለፍ ይቜላሉ - ወይም ዋጋውን በጭራሜ አይግለጹ ፣ ምክንያቱም ይህ አምድ በጠፈር ውስጥ ዚመጚሚሻውን ቊታ ይይዛል.

ዚማስገባቱን ውጀት እንፈትሜ፡-

tarantool> box.space.goods:select()
---
- - [1, 'pen', 123, 1]
  - [2, 'pencil', 321, 2]
  - [3, 'brush', 100, 3]
  - [4, 'watercolour', 456, 4]
  - [5, 'album', 101, 5]
  - [6, 'notebook', 800, 6]
  - [7, 'rubber', 531, 7]
  - [8, 'ruler', 135, 8]
...

እንደሚመለኚቱት, ዚመጀመሪያዎቹ እና ዚመጚሚሻዎቹ መስኮቜ በራስ-ሰር ይሞላሉ. አሁን ዚቊታ ለውጊቜን ኚገጜ በገጜ ለመጫን ተግባር መፃፍ ቀላል ይሆናል። goods:

local page_size = 5
local function get_goods(row_ver)
    local index = box.space.goods.index.row_ver
    local goods = {}
    local counter = 0
    for _, tuple in index:pairs(row_ver, {
        iterator = 'GT' }) do
        local obj = tuple:tomap({ names_only = true })
        table.insert(goods, obj)
        counter = counter + 1
        if counter >= page_size then
            break
        end
    end
    return goods
end

ተግባሩ እሎቱን እንደ መለኪያ ይወስዳል row_ver, ኚእሱ ጀምሮ ለውጊቜን ማውሚድ አስፈላጊ ነው, እና ዹተለወጠውን ውሂብ ዹተወሰነ ክፍል ይመልሳል.

በ Tarantool ውስጥ ዚውሂብ ናሙና ዹሚኹናወነው በመሹጃ ጠቋሚዎቜ ነው። ተግባር get_goods ተደጋጋሚ መሹጃን በመሹጃ ጠቋሚ ይጠቀማል row_ver ዹተለወጠ ውሂብ ለመቀበል. ዚመድገም አይነት GT ነው (ኚሚበልጥ ይበልጣል፣ኚሚበልጥ)። ይህ ማለት ድግግሞሹ ኹተላለፈው ቁልፍ (ዚመስክ እሎት) ጀምሮ ዚኢንዎክስ እሎቶቜን በቅደም ተኹተል ይሻገራል ማለት ነው። row_ver).

ተደጋጋሚው ቱፕልስ ይመልሳል። በመቀጠል በኀቜቲቲፒ በኩል መሹጃን ለማስተላለፍ ቱፕልቹን ለቀጣይ ተኚታታይነት ወደሚመቜ መዋቅር መለወጥ አስፈላጊ ነው። ምሳሌው ለዚህ መደበኛ ተግባር ይጠቀማል tomap. ኹመጠቀም ይልቅ tomap ዚእራስዎን ተግባር መፃፍ ይቜላሉ. ለምሳሌ ዚመስክን ስም መቀዹር እንፈልጋለን name, ሜዳውን አያልፉ code እና መስክ ይጚምሩ comment:

local function unflatten_goods(tuple)
    local obj = {}
    obj.id = tuple.id
    obj.goods_name = tuple.name
    obj.comment = 'some comment'
    obj.row_ver = tuple.row_ver
    return obj
end

ዚውጀቱ ውሂብ ገጜ መጠን (በአንድ ክፍል ውስጥ ያሉ ዚመዝገቊቜ ብዛት) በተለዋዋጭ ይወሰናል page_size. በምሳሌው ውስጥ እሎቱ page_size ነው 5. በእውነተኛ ፕሮግራም ውስጥ, ዚገጹ መጠን አብዛኛውን ጊዜ ዹበለጠ አስፈላጊ ነው. በቊታው tuple አማካኝ መጠን ይወሰናል. ዚውሂብ ማስተላለፍ ጊዜን በመለካት ጥሩው ዚገጜ መጠን በተጚባጭ ሊወሰን ይቜላል። ዚገጹ መጠን በትልቁ፣ በተላኪው እና በተቀባዩ ጎኖቜ መካኚል ያለው ዚመዞሪያ ብዛት አነስተኛ ይሆናል። በዚህ መንገድ ለውጊቜን ለማውሚድ አጠቃላይ ጊዜን መቀነስ ይቜላሉ። ነገር ግን፣ ዚገጹ መጠን በጣም ትልቅ ኚሆነ፣ ናሙናውን ሲሪያል በአገልጋዩ ላይ በጣም ሹጅም ጊዜ እናሳልፋለን። በዚህ ምክንያት ወደ አገልጋዩ ዚሚመጡ ሌሎቜ ጥያቄዎቜን ለማስኬድ መዘግዚቶቜ ሊኖሩ ይቜላሉ። መለኪያ page_size ኚማዋቀሪያው ፋይል ሊጫን ይቜላል. ለእያንዳንዱ ዹተላለፈ ቊታ, ዚራሱን ዋጋ ማዘጋጀት ይቜላሉ. ነገር ግን፣ ለአብዛኛዎቹ ቊታዎቜ ነባሪ እሎቱ (ለምሳሌ 100) ተስማሚ ሊሆን ይቜላል።

ተግባሩን እናኚናውን get_goods:

tarantool> get_goods(0)

---
- - row_ver: 1
    code: 123
    name: pen
    id: 1
  - row_ver: 2
    code: 321
    name: pencil
    id: 2
  - row_ver: 3
    code: 100
    name: brush
    id: 3
  - row_ver: 4
    code: 456
    name: watercolour
    id: 4
  - row_ver: 5
    code: 101
    name: album
    id: 5
...

ዚመስክ ዋጋን እንውሰድ row_ver ኚመጚሚሻው መስመር እና ተግባሩን እንደገና ይደውሉ:

tarantool> get_goods(5)

---
- - row_ver: 6
    code: 800
    name: notebook
    id: 6
  - row_ver: 7
    code: 531
    name: rubber
    id: 7
  - row_ver: 8
    code: 135
    name: ruler
    id: 8
...

አንዮ እንደገና:

tarantool> get_goods(8)
---
- []
...

እንደሚመለኚቱት ፣ በዚህ መንገድ ጥቅም ላይ ሲውል ፣ ተግባሩ ሁሉንም ዚቊታ መዝገቊቜን ገጜ በገጜ ይመልሳል goods. ዚመጚሚሻው ገጜ ባዶ ምርጫ ይኚተላል።

በቊታ ላይ ለውጊቜን እናድርግ፡-

box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}

ዚመስክ ዋጋን ቀይሚናል። name ለአንድ ግቀት እና ሁለት አዳዲስ ግቀቶቜን አክለዋል.

ዚመጚሚሻውን ዚተግባር ጥሪ እንድገመው፡-

tarantool> get_goods(8)
---



- - row_ver: 9
    code: 800
    name: copybook
    id: 6
  - row_ver: 10
    code: 234
    name: clip
    id: 9
  - row_ver: 11
    code: 432
    name: folder
    id: 10
...

ተግባሩ ዚተቀዚሩትን እና ዚተጚመሩትን መዝገቊቜን መለሰ. ስለዚህ ተግባሩ get_goods ኚመጚሚሻው ጥሪ በኋላ ዹተቀዹሹ ውሂብ እንዲቀበሉ ይፈቅድልዎታል ፣ ይህም ኚግምት ውስጥ ያለው ዚማባዛት ዘዮ መሠሚት ነው።

ዚውጀት አሰጣጥን በ HTTP በኩል በJSON መልክ ኹዚህ ጜሁፍ ወሰን ውጭ እንተዋለን። ስለዚህ ጉዳይ እዚህ ማንበብ ይቜላሉ- https://habr.com/ru/company/mailru/blog/272141/

ዹደንበኛው / ዚባሪያ ክፍል መተግበር

ዚተቀባዩ ወገን አተገባበር ምን እንደሚመስል እንመልኚት። ዹወሹደውን ውሂብ ለማኚማ቞ት በተቀባዩ በኩል ቊታ እንፍጠር፡-

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

ዚቊታው መዋቅር ኚምንጩ ውስጥ ካለው ዚቊታ አሠራር ጋር ይመሳሰላል. ነገር ግን ዹተቀበለውን ውሂብ ወደ ሌላ ቊታ ስለማያስተላልፉ, አምድ row_ver በተቀባዩ ቊታ ላይ አይደለም። በመስክ ላይ id ዹምንጭ መለያዎቜ ይመዘገባሉ. ስለዚህ, በተቀባዩ በኩል በራስ-ሰር እንዲጚምር ማድሚግ አያስፈልግም.

በተጚማሪም, እሎቶቜን ለማስቀመጥ ቊታ እንፈልጋለን row_ver:

box.schema.space.create('row_ver', {
    format = {
        {
            name = 'space_name',
            type = 'string'

        },
        {
            name = 'value',
            type = 'string'

        }
    },
    if_not_exists = true
})

box.space.row_ver:create_index('primary', {
    parts = { 'space_name' },
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

ለእያንዳንዱ ዚተጫነ ቊታ (መስክ space_name) ዚመጚሚሻውን ዚተጫነውን ዋጋ እዚህ እናስቀምጠዋለን row_ver (ሜዳ value). ዓምዱ እንደ ዋና ቁልፍ ነው ዚሚሰራው። space_name.

ዚቊታ ውሂብን ለመጫን ተግባር እንፍጠር goods በ HTTP በኩል. ይህንን ለማድሚግ ዚኀቜቲቲፒ ደንበኛን ዹሚተገበር ቀተ-መጜሐፍት እንፈልጋለን። ዹሚኹተለው መስመር ቀተ መፃህፍቱን ይጭናል እና ዚኀቜቲቲፒ ደንበኛን ያፋጥናል፡

local http_client = require('http.client').new()

ለ json ዲሎሪያላይዜሜን እንዲሁ ቀተ-መጜሐፍት እንፈልጋለን፡-

local json = require('json')

ይህ ዚውሂብ ጭነት ተግባር ለመፍጠር በቂ ነው-

local function load_data(url, row_ver)
    local url = ('%s?rowVer=%s'):format(url,
        tostring(row_ver))
    local body = nil
    local data = http_client:request('GET', url, body, {
        keepalive_idle =  1,
        keepalive_interval = 1
    })
    return json.decode(data.body)
end

ተግባሩ ዚኀቜቲቲፒ ጥያቄን ወደ ዩአርኀል አድራሻ ያኚናውናል እና ይልካል row_ver እንደ ልኬት እና ዚጥያቄውን ያልተጠበቀ ውጀት ይመልሳል።

ዹተቀበለውን ውሂብ ዚማስቀመጥ ተግባር ይህንን ይመስላል።

local function save_goods(goods)
    local n = #goods
    box.atomic(function()
        for i = 1, n do
            local obj = goods[i]
            box.space.goods:put(
                obj.id, obj.name, obj.code)
        end
    end)
end

ውሂብን ወደ ቊታ ዚማስቀመጥ ዑደት goods በግብይት ውስጥ ዹተቀመጠ (ተግባሩ ለዚህ ጥቅም ላይ ይውላል box.atomic) ዚዲስክ ስራዎቜን ቁጥር ለመቀነስ.

በመጚሚሻም, ዚአካባቢያዊ ቊታ ማመሳሰል ተግባር goods ኚምንጩ ጋር እንደሚኚተለው ተግባራዊ ማድሚግ ይቜላሉ-

local function sync_goods()
    local tuple = box.space.row_ver:get('goods')
    local row_ver = tuple and tuple.value or 0

    —— set your url here:
    local url = 'http://127.0.0.1:81/test/goods/list'

    while true do
        local goods = load_goods(url, row_ver)

        local count = #goods
        if count == 0 then
            return
        end

        save_goods(goods)

        row_ver = goods[count].rowVer
        box.space.row_ver:put({'goods', row_ver})
    end
end

በመጀመሪያ ቀደም ሲል ዹተቀመጠውን እሎት እናነባለን row_ver ለቊታ goods. ኹጠፋ (ዚመጀመሪያው ዚልውውጥ ክፍለ ጊዜ), ኚዚያም እንደ እንወስዳለን row_ver ዜሮ. በመቀጠል በዑደቱ ውስጥ በተጠቀሰው ዩአርኀል ላይ ካለው ምንጭ ዹተለወጠውን መሹጃ ኚገጜ በገጜ ማውሚድ እናኚናውናለን። በእያንዳንዱ ድግግሞሜ, ዹተቀበለውን ውሂብ ወደ ተገቢው ዚአካባቢ ቊታ እናስቀምጠዋለን እና እሎቱን እናዘምነዋለን row_ver (በጠፈር ውስጥ row_ver እና በተለዋዋጭ row_ver) - ዋጋውን ይውሰዱ row_ver ኚተጫነው ዚመጚሚሻው መስመር.

በአጋጣሚ ማዞርን ለመኹላኹል (በፕሮግራሙ ውስጥ ስህተት ኹተፈጠሹ) ምልልሱ while ሊተካ ይቜላል for:

for _ = 1, max_req do ...

ተግባሩን በመፈፀም ምክንያት sync_goods ክፍተት goods ተቀባዩ ዹሁሉም ዹጠፈር መዛግብት ዚቅርብ ጊዜ ስሪቶቜን ይይዛል goods ምንጩ ውስጥ.

በግልጜ እንደሚታዚው, ዚውሂብ መሰሹዝ በዚህ መንገድ ሊሰራጭ አይቜልም. እንደዚህ አይነት ፍላጎት ካለ, ዚስሚዛ ምልክት መጠቀም ይቜላሉ. ወደ ቊታ ያክሉ goods ቡሊያን መስክ is_deleted እና መዝገብን በአካል ኹመሰሹዝ ይልቅ ሎጂካዊ ስሚዛን እንጠቀማለን - ዚመስክ ዋጋን እናስቀምጣለን። is_deleted ወደ ትርጉም true. አንዳንድ ጊዜ ኚቊሊያን መስክ ይልቅ is_deleted ሜዳውን ለመጠቀም ዹበለጠ አመቺ ነው deleted, ይህም ዚመዝገቡ ምክንያታዊ ስሚዛ ቀን-ሰዓት ያኚማቻል. አመክንዮአዊ መሰሹዝን ካደሚጉ በኋላ, ለመሰሹዝ ምልክት ዚተደሚገበት መዝገብ ኚምንጩ ወደ መድሚሻው (ኹላይ በተገለጾው ሎጂክ መሰሚት) ይተላለፋል.

ቅደም ተኹተል row_ver ኚሌሎቜ ቊታዎቜ መሹጃን ለማስተላለፍ ጥቅም ላይ ሊውል ይቜላል: ለእያንዳንዱ ዹሚተላለፍ ቊታ ዹተለዹ ቅደም ተኹተል መፍጠር አያስፈልግም.

Tarantool DBMS ን በመጠቀም በመተግበሪያዎቜ ውስጥ ባለ ኹፍተኛ ደሹጃ ዚውሂብ ማባዛት ውጀታማ መንገድን ተመልክተናል።

ግኝቶቜ

  1. Tarantool DBMS ኹፍተኛ ጭነት ያላ቞ው መተግበሪያዎቜን ለመፍጠር ዚሚስብ፣ ተስፋ ሰጪ ምርት ነው።
  2. ዹኹፍተኛ ደሹጃ ዚውሂብ ማባዛት ኹዝቅተኛ ደሹጃ ማባዛት ይልቅ በርካታ ጥቅሞቜ አሉት።
  3. በአንቀጹ ውስጥ ዚተብራራው ዹኹፍተኛ ደሹጃ ዚማባዛት ዘዮ ኚመጚሚሻው ዚልውውጥ ክፍለ ጊዜ በኋላ ዚተቀዚሩትን መዝገቊቜ ብቻ በማስተላለፍ ዹተላለፈውን ውሂብ መጠን ለመቀነስ ያስቜልዎታል።

ምንጭ: hab.com

በDDoS ጥበቃ፣ VPS VDS አገልጋዮቜ ለጣቢያዎቜ አስተማማኝ ማስተናገጃ ይግዙ 🔥 አስተማማኝ ዚድር ጣቢያ ማስተናገጃ በዲዶኀስ ጥበቃ፣ በቪፒኀስ ቪዲኀስ አገልጋዮቜ ይግዙ | ProHoster