ããã«ã¡ã¯ãDBMS çšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŠããŸãã
åãæããŸãïŒ (âŠããã©ãŒãã³ã¹ãã楜ãã¿ãã ãã)
äžèšã®ãã¹ãŠã«ãããTarantool ã¯ããŒã¿ããŒã¹ã§åäœããé«è² è·ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®é
åçãªãã©ãããã©ãŒã ã«ãªããŸãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå€ãã®å ŽåãããŒã¿ã®è€è£œãå¿
èŠã«ãªããŸãã
åè¿°ããããã«ãTarantool ã«ã¯ããŒã¿ ã¬ããªã±ãŒã·ã§ã³ãçµã¿èŸŒãŸããŠããŸãã ãã®åäœåçã¯ããã¹ã¿ãŒ ãã° (WAL) ã«å«ãŸãããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ãã¬ããªã«äžã§é çªã«å®è¡ããããšã§ãã éåžžããã®ãããªã¬ããªã±ãŒã·ã§ã³ (ããã«ãããã¬ããªã±ãŒã·ã§ã³ãšåŒã³ãŸã) äœã¬ãã«ã®) ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã©ãŒã«ã ãã¬ã©ã³ã¹ã確ä¿ããããã¯ã©ã¹ã¿ãŒ ããŒãéã§èªã¿åãè² è·ãåæ£ãããããããã«äœ¿çšãããŸãã
ç±³ã 1. ã¯ã©ã¹ã¿ãŒå
ã®ã¬ããªã±ãŒã·ã§ã³
代æ¿ã·ããªãªã®äŸãšããŠã¯ãããããŒã¿ããŒã¹ã§äœæãããããŒã¿ããåŠç/ç£èŠã®ããã«å¥ã®ããŒã¿ããŒã¹ã«è»¢éããããšãæããããŸãã åŸè ã®å Žåããã䟿å©ãªè§£æ±ºçã¯æ¬¡ã®ãšããã§ãã äžçŽ ã¬ããªã±ãŒã·ã§ã³ - ã¢ããªã±ãŒã·ã§ã³ ããžãã¹ ããžã㯠ã¬ãã«ã§ã®ããŒã¿ ã¬ããªã±ãŒã·ã§ã³ã ãããã®ã DBMS ã«çµã¿èŸŒãŸããæ¢æã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããã®ã§ã¯ãªããéçºäžã®ã¢ããªã±ãŒã·ã§ã³å ã§ç¬èªã«ã¬ããªã±ãŒã·ã§ã³ãå®è£ ããŸãã ãã®ã¢ãããŒãã«ã¯å©ç¹ãšæ¬ ç¹ã®äž¡æ¹ããããŸãã ã¡ãªãããæããŠã¿ãŸãããã
1. ãã©ãã£ãã¯ã®ç¯çŽ:
- ãã¹ãŠã®ããŒã¿ã転éããããšã¯ã§ããããã®äžéšã®ã¿ã転éããããšã¯ã§ããŸã (ããšãã°ãç¹å®ã®åºæºãæºããäžéšã®ããŒãã«ããã®åãŸãã¯ã¬ã³ãŒãã®äžéšã®ã¿ã転éã§ããŸã)ã
- éåæ (Tarantool ã®çŸåšã®ããŒãžã§ã³ - 1.10 ã§å®è£ ããã) ãŸãã¯åæ (Tarantool ã®ä»¥éã®ããŒãžã§ã³ã§å®è£ ããã) ã¢ãŒãã§ç¶ç¶çã«å®è¡ãããäœã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ãšã¯ç°ãªããé«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ã¯ã»ãã·ã§ã³ã§å®è¡ã§ããŸã (ã€ãŸããã¢ããªã±ãŒã·ã§ã³ã¯æåã«ããŒã¿ (亀æã»ãã·ã§ã³ ããŒã¿) ãåæãããã®åŸã¬ããªã±ãŒã·ã§ã³ãäžæåæ¢ãããã®åŸæ¬¡ã®äº€æã»ãã·ã§ã³ãçºçãããªã©)ã
- ã¬ã³ãŒããæ°åå€æŽãããŠããå Žåã¯ãææ°ããŒãžã§ã³ã®ã¿ã転éã§ããŸã (ãã¹ã¿ãŒäžã§è¡ããããã¹ãŠã®å€æŽãã¬ããªã«äžã§é çªã«åçãããäœã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ãšã¯ç°ãªããŸã)ã
2. HTTP 亀æã®å®è£ ã«é£ããããšã¯ãªãããªã¢ãŒã ããŒã¿ããŒã¹ãåæã§ããŸãã
ç±³ã 2. HTTP çµç±ã®ã¬ããªã±ãŒã·ã§ã³
3. ããŒã¿ã転éãããããŒã¿ããŒã¹æ§é ã¯åãã§ããå¿ èŠã¯ãããŸãã (ããã«ãäžè¬çãªå Žåãç°ãªã DBMSãããã°ã©ãã³ã°èšèªããã©ãããã©ãŒã ãªã©ã䜿çšããããšãå¯èœã§ã)ã
ç±³ã 3. ç°çš®ã·ã¹ãã ã§ã®ã¬ããªã±ãŒã·ã§ã³
æ¬ ç¹ã¯ãå¹³åããŠãããã°ã©ãã³ã°ã¯æ§æãããé£ãããã³ã¹ããããããããçµã¿èŸŒã¿æ©èœãã«ã¹ã¿ãã€ãºãã代ããã«ç¬èªã®æ©èœãå®è£ ããå¿ èŠãããããšã§ãã
ç¶æ³ã«ãããŠäžèšã®å©ç¹ãéèŠã§ãã (ãŸãã¯å¿ èŠãªæ¡ä»¶ã§ãã) å Žåã¯ãé«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ã䜿çšããããšãçã«ããªã£ãŠããŸãã Tarantool DBMS ã§é«ã¬ãã«ã®ããŒã¿ ã¬ããªã±ãŒã·ã§ã³ãå®è£ ããããã€ãã®æ¹æ³ãèŠãŠã¿ãŸãããã
ãã©ãã£ãã¯ã®æå°å
ãããã£ãŠãé«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ã®å©ç¹ã® XNUMX ã€ã¯ãã©ãã£ãã¯ã®ç¯çŽã§ãã ãã®å©ç¹ãååã«çºæ®ããã«ã¯ãå亀æã»ãã·ã§ã³äžã«è»¢éãããããŒã¿éãæå°éã«æããå¿ èŠããããŸãã ãã¡ãããã»ãã·ã§ã³ã®çµäºæã«ãããŒã¿åä¿¡è ããœãŒã¹ãšåæããå¿ èŠãããããšãå¿ããŠã¯ãªããŸãã (å°ãªããšããã¬ããªã±ãŒã·ã§ã³ã«é¢ä¿ããããŒã¿ã®éšåã«ã€ããŠã¯)ã
é«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³äžã«è»¢éãããããŒã¿éãæå°éã«æããã«ã¯ã©ãããã°ããã§ãã? ç°¡åãªè§£æ±ºçã¯ãæ¥ä»ãšæå»ã§ããŒã¿ãéžæããããšã§ãã ãããè¡ãã«ã¯ãããŒãã«ã«æ¢ã«ååšããæ¥ä»/æå»ãã£ãŒã«ã (ååšããå Žå) ã䜿çšã§ããŸãã ããšãã°ãã泚æãããã¥ã¡ã³ãã«ã¯ãå¿
èŠãªæ³šæå®è¡æéããã£ãŒã«ããå«ãŸããå ŽåããããŸãã delivery_time
ã ãã®ãœãªã¥ãŒã·ã§ã³ã®åé¡ã¯ããã®ãã£ãŒã«ãã®å€ã泚æã®äœæã«å¯Ÿå¿ããé åºã§ããå¿
èŠããªãããšã§ãã ãããã£ãŠããã£ãŒã«ãã®æ倧å€ãæãåºãããšãã§ããŸãã delivery_time
ãåã®äº€æã»ãã·ã§ã³äžã«éä¿¡ããã次ã®äº€æã»ãã·ã§ã³äžã«ããé«ããã£ãŒã«ãå€ãæã€ãã¹ãŠã®ã¬ã³ãŒããéžæããŸã delivery_time
ã ãã£ãŒã«ãå€ãäœãã¬ã³ãŒãã亀æã»ãã·ã§ã³ã®éã«è¿œå ãããå¯èœæ§ããããŸã delivery_time
ã ãŸããé åºãå€æŽãããå¯èœæ§ããããŸããããã£ãŒã«ãã«ã¯åœ±é¿ããŸããã§ããã delivery_time
ã ã©ã¡ãã®å Žåããå€æŽã¯ãœãŒã¹ããå®å
ã«è»¢éãããŸããã ãããã®åé¡ã解決ããã«ã¯ãããŒã¿ããéè€ããŠã転éããå¿
èŠããããŸãã ãããã®ã å亀æã»ãã·ã§ã³ã§ã¯ããã£ãŒã«ãå€ãå«ããã¹ãŠã®ããŒã¿ã転éããŸãã delivery_time
ãéå»ã®ããæç¹ (ããšãã°ãçŸåšã®ç¬éãã N æé) ãè¶
ããŸãã ãã ãã倧èŠæš¡ã·ã¹ãã ã®å Žåããã®ã¢ãããŒãã¯éåžžã«åé·ã§ãããç§ãã¡ãç®æããŠãããã©ãã£ãã¯ã®ç¯çŽããŒãã«ãªã£ãŠããŸãå¯èœæ§ãããããšã¯æããã§ãã ããã«ã転éãããããŒãã«ã«ã¯ãæ¥ä»/æå»ã«é¢é£ä»ãããããã£ãŒã«ãããªãå ŽåããããŸãã
ãã XNUMX ã€ã®è§£æ±ºçã¯ãå®è£
ã®ç¹ã§ããè€éã§ãããããŒã¿ã®åä¿¡ã確èªããããšã§ãã ãã®å Žåãå亀æã»ãã·ã§ã³äžã«ãã¹ãŠã®ããŒã¿ãéä¿¡ãããŸãããåä¿¡è
ã¯ãã®åä¿¡ã確èªããŠããŸããã ãããå®è£
ããã«ã¯ããœãŒã¹ ããŒãã«ã«ããŒã«åãè¿œå ããå¿
èŠããããŸã (ããšãã°ã is_transferred
ïŒã åä¿¡è
ãã¬ã³ãŒãã®åä¿¡ã確èªãããšã察å¿ãããã£ãŒã«ãã¯æ¬¡ã®å€ãååŸããŸãã true
ããã®åŸããšã³ããªã¯äº€æã«é¢äžããªããªããŸãã ãã®å®è£
ãªãã·ã§ã³ã«ã¯æ¬¡ã®æ¬ ç¹ããããŸãã ãŸãã転éãããã¬ã³ãŒãããšã«ç¢ºèªå¿çãçæããŠéä¿¡ããå¿
èŠããããŸãã 倧ãŸãã«èšãã°ãããã¯è»¢éãããããŒã¿éã XNUMX åã«ãªããã©ãŠã³ãããªããæ°ã XNUMX åã«ãªãããšã«çžåœããŸãã 第 XNUMX ã«ãåãã¬ã³ãŒããè€æ°ã®åä¿¡è
ã«éä¿¡ããå¯èœæ§ã¯ãããŸãã (æåã«åä¿¡ããåä¿¡è
ã¯ãèªåèªèº«ãšä»ã®ãã¹ãŠã®åä¿¡è
ã«å¯ŸããŠåä¿¡ã確èªããŸã)ã
äžèšã®æ¬ ç¹ãæããªãæ¹æ³ã¯ãéä¿¡ãããããŒãã«ã«åãè¿œå ããŠããã®è¡ã®å€æŽã远跡ããããšã§ãã ãã®ãããªåã¯æ¥æåã«ããããšãã§ããã¬ã³ãŒããè¿œå /å€æŽããããã³ã« (è¿œå /å€æŽãšãšãã«ã¢ãããã¯ã«) ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠçŸåšæå»ã«èšå®/æŽæ°ãããå¿
èŠããããŸãã äŸãšããŠãåãåŒã³åºããŠã¿ãŸããã update_time
ã 転éãããã¬ã³ãŒãã®ãã®åã®æ倧ãã£ãŒã«ãå€ãä¿åãããšããã®å€ã§æ¬¡ã®äº€æã»ãã·ã§ã³ãéå§ã§ããŸãïŒãã£ãŒã«ãå€ãæã€ã¬ã³ãŒããéžæããŸãïŒ update_time
ã以åã«ä¿åãããå€ãè¶
ããŠããŸãïŒã åŸè
ã®ã¢ãããŒãã®åé¡ã¯ãããŒã¿å€æŽããããã§çºçããå¯èœæ§ãããããšã§ãã åã®ãã£ãŒã«ãå€ã®çµæãšã㊠update_time
äžæã§ã¯ãªããããããŸããã ãããã£ãŠããã®åã¯åå²ããã (ããŒãžããšã®) ããŒã¿åºåã«ã¯äœ¿çšã§ããŸããã ããŒã¿ãããŒãžããšã«è¡šç€ºããã«ã¯ãå¹çãéåžžã«äœãå¯èœæ§ãé«ãè¿œå ã®ã¡ã«ããºã ãçºæããå¿
èŠããããŸã (ããšãã°ã次ã®å€ãæã€ãã¹ãŠã®ã¬ã³ãŒããããŒã¿ããŒã¹ããååŸãããªã©)ã update_time
æå®ãããå€ãããé«ãããµã³ãã«ã®å
é ããç¹å®ã®ãªãã»ããããéå§ããŠç¹å®ã®æ°ã®ã¬ã³ãŒããçæããŸã)ã
以åã®ã¢ãããŒãããããã«æ¹åããããšã§ãããŒã¿è»¢éã®å¹çãåäžãããããšãã§ããŸãã ãããè¡ãã«ã¯ãå€æŽã远跡ããããã®åãã£ãŒã«ãå€ãšããŠæŽæ°å (é·æŽæ°) ã䜿çšããŸãã åã«ååãä»ããŸããã row_ver
ã ãã®åã®ãã£ãŒã«ãå€ã¯ãã¬ã³ãŒããäœæ/å€æŽããããã³ã«èšå®/æŽæ°ããå¿
èŠããããŸãã ãã ãããã®å Žåããã£ãŒã«ãã«ã¯çŸåšã®æ¥æãå²ãåœãŠããããäœããã®ã«ãŠã³ã¿ãŒã®å€ã XNUMX ãã€å¢å ããŠå²ãåœãŠãããŸãã ãã®çµæãã³ã©ã ã¯ã row_ver
äžæã®å€ãå«ãŸããŠãããããã«ã¿ãããŒã¿ (ååã®äº€æã»ãã·ã§ã³ã®çµäºä»¥éã«è¿œå /å€æŽãããããŒã¿) ã衚瀺ããã ãã§ãªãããããç°¡åãã€å¹æçã«ããŒãžã«åå²ããããã«äœ¿çšããããšãã§ããŸãã
é«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯å ã§è»¢éãããããŒã¿éãæå°éã«æããæåŸã«ææ¡ãããæ¹æ³ããç§ã«ã¯æãæé©ã§æ®éçã§ããããã«æããŸãã ããã«è©³ããèŠãŠã¿ãŸãããã
è¡ããŒãžã§ã³ã«ãŠã³ã¿ãŒã䜿çšããããŒã¿ã®åãæž¡ã
ãµãŒããŒ/ãã¹ã¿ãŒéšåã®å®è£
MS SQL Server ã«ã¯ããã®ã¢ãããŒããå®è£
ããããã®ç¹å¥ãªåã¿ã€ãããããŸãã rowversion
ã åããŒã¿ããŒã¹ã«ã¯ã次ã®ãããªåãæã€ããŒãã«ã§ã¬ã³ãŒããè¿œå /å€æŽããããã³ã« XNUMX ãã€å¢å ããã«ãŠã³ã¿ãŒããããŸãã 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 ã¯ãã®ãªããžã§ã¯ããå床äœæããããšããŸããã ãã®ãªãã·ã§ã³ã¯ãåŸç¶ã®ãã¹ãŠã® DDL ã³ãã³ãã§äœ¿çšãããŸãã
äŸãšããŠã¹ããŒã¹ãäœæããŠã¿ãŸãããã
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
æ°ããã¬ã³ãŒããè¿œå ãããšãã ãã§ãªããæ¢åã®ã¬ã³ãŒããå€æŽãããšãã«ã XNUMX ãã€å¢ããå¿
èŠããããŸãã ããã«ã¯ããªã¬ãŒã䜿çšã§ããŸãã Tarantool ã«ã¯ XNUMX çš®é¡ã®ã¹ããŒã¹ ããªã¬ãŒããããŸãã before_replace
О on_replace
ã ã¹ããŒã¹å
ã®ããŒã¿ãå€æŽããããã³ã«ããªã¬ãŒãèµ·åãããŸã (å€æŽã®åœ±é¿ãåããã¿ãã«ããšã«ãããªã¬ãŒé¢æ°ãèµ·åãããŸã)ã ãšã¯ç°ãªã on_replace
, before_replace
-triggers ã䜿çšãããšãããªã¬ãŒãå®è¡ãããã¿ãã«ã®ããŒã¿ãå€æŽã§ããŸãã ãããã£ãŠãæåŸã®ã¿ã€ãã®ããªã¬ãŒãç§ãã¡ã«é©ããŠããŸãã
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
æ ŒçŽãããã¿ãã«ãã·ãŒã±ã³ã¹ã®æ¬¡ã®å€ã«å€æãã 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}
ãªããªãæåã®ãã£ãŒã«ãã¯èªåã€ã³ã¯ãªã¡ã³ãããã«ãŠã³ã¿ãŒã§ã代ããã« nil ãæž¡ããŸãã Tarantool ã¯æ¬¡ã®å€ãèªåçã«çœ®ãæããŸãã åæ§ã«ãåãã£ãŒã«ãã®å€ãšã㊠row_ver
nil ãæž¡ãããšããå€ããŸã£ããæå®ããªãããšãã§ããŸãã ãã®åã¯ã¹ããŒã¹ã®æåŸã®äœçœ®ãå ããŸãã
æ¿å ¥çµæã確èªããŠã¿ãŸãããã
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 (Greater Thanããã倧ãã) ã§ãã ããã¯ãã€ãã¬ãŒã¿ãæž¡ãããããŒïŒãã£ãŒã«ãå€ïŒããå§ãŸãã€ã³ããã¯ã¹å€ãé çªã«èµ°æ»ããããšãæå³ããŸãã row_ver
).
ã€ãã¬ãŒã¿ã¯ã¿ãã«ãè¿ããŸãã ãã®åŸ HTTP çµç±ã§ããŒã¿ã転éã§ããããã«ããã«ã¯ãã¿ãã«ããã®åŸã®ã·ãªã¢ã«åã«äŸ¿å©ãªæ§é ã«å€æããå¿
èŠããããŸãã ãã®äŸã§ã¯ãããã«æšæºé¢æ°ã䜿çšããŸãã 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
åºåããŒã¿ã®ããŒãž ãµã€ãº (XNUMX ã€ã®éšåã®ã¬ã³ãŒãæ°) ã¯å€æ°ã«ãã£ãŠæ±ºãŸããŸãã page_size
ã ãã®äŸã§ã¯ãå€ã¯ page_size
å®éã®ããã°ã©ã ã§ã¯ãéåžžã¯ããŒãž ãµã€ãºã®æ¹ãéèŠã§ãã ããã¯ç©ºéã¿ãã«ã®å¹³åãµã€ãºã«ãã£ãŠç°ãªããŸãã æé©ãªããŒãž ãµã€ãºã¯ãããŒã¿è»¢éæéã枬å®ããããšã§çµéšçã«æ±ºå®ã§ããŸãã ããŒãžãµã€ãºã倧ããã»ã©ãéä¿¡åŽãšåä¿¡åŽã®éã®åŸåŸ©åæ°ã¯å°ãªããªããŸãã ããããããšã§ãå€æŽãããŠã³ããŒãããå
šäœã®æéãççž®ã§ããŸãã ãã ããããŒãž ãµã€ãºã倧ãããããšããµãŒããŒã§ã®ãµã³ãã«ã®ã·ãªã¢ã«åã«æéãããããããŸãã ãã®çµæããµãŒããŒã«éä¿¡ãããä»ã®ãªã¯ãšã¹ãã®åŠçã«é
延ãçºçããå¯èœæ§ããããŸãã ãã©ã¡ãŒã¿ 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
XNUMX ã€ã®ãšã³ããªã«å ããXNUMX ã€ã®æ°ãããšã³ããªãè¿œå ããŸããã
æåŸã®é¢æ°åŒã³åºããç¹°ãè¿ããŠã¿ãŸãããã
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
ã䜿çšãããšãæåŸã®åŒã³åºã以éã«å€æŽãããããŒã¿ãåä¿¡ã§ããŸããããããæ€èšäžã®ã¬ããªã±ãŒã·ã§ã³æ¹æ³ã®åºç€ãšãªããŸãã
JSON 圢åŒã§ã® HTTP çµç±ã®çµæã®çºè¡ã«ã€ããŠã¯ããã®èšäºã®ç¯å²å€ãšããŠãããŸãã ããã«ã€ããŠã¯ããã§èªãããšãã§ããŸã:
ã¯ã©ã€ã¢ã³ã/ã¹ã¬ãŒãéšåã®å®è£
åä¿¡åŽã®å®è£ ãã©ã®ãããªãã®ããèŠãŠã¿ãŸãããã ããŠã³ããŒãããããŒã¿ãä¿åããããã®ã¹ããŒã¹ãåä¿¡åŽã«äœæããŸãããã
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çµç±ã§ã ãããè¡ãã«ã¯ãHTTP ã¯ã©ã€ã¢ã³ããå®è£
ããã©ã€ãã©ãªãå¿
èŠã§ãã 次ã®è¡ã¯ã©ã€ãã©ãªãããŒããã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
ãã®é¢æ°ã¯ãURL ã¢ãã¬ã¹ã«å¯Ÿã㊠HTTP ãªã¯ãšã¹ããå®è¡ããéä¿¡ããŸãã 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
ãŒãã ãµã€ã¯ã«ã®æ¬¡ã¯ãæå®ããã URL ã®ãœãŒã¹ããå€æŽãããããŒã¿ãããŒãžããšã«ããŠã³ããŒãããŸãã åå埩ã§ãåä¿¡ããããŒã¿ãé©åãªããŒã«ã«ç©ºéã«ä¿åããå€ãæŽæ°ããŸãã 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 ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã§é«ã¬ãã«ã®ããŒã¿ ã¬ããªã±ãŒã·ã§ã³ãè¡ãå¹æçãªæ¹æ³ãæ€èšããŸããã
æèŠ
- Tarantool DBMS ã¯ãé«è² è·ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®é åçã§ææãªè£œåã§ãã
- é«ã¬ãã«ã®ããŒã¿ ã¬ããªã±ãŒã·ã§ã³ã«ã¯ãäœã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³ã«æ¯ã¹ãŠå€ãã®å©ç¹ããããŸãã
- ãã®èšäºã§èª¬æãããŠããé«ã¬ãã«ã®ã¬ããªã±ãŒã·ã§ã³æ¹æ³ã䜿çšãããšãæåŸã®äº€æã»ãã·ã§ã³ä»¥éã«å€æŽãããã¬ã³ãŒãã®ã¿ã転éããããšã§ã転éãããããŒã¿ã®éãæå°éã«æããããšãã§ããŸãã
åºæïŒ habr.com