
ãããžã§ã¯ãã³ãŒã...äžè¬ã«ã圌ã®åŠæŽã®äœãåŠçãæžãããããªå°è±¡ããããŸãã...ãããŠãããã¯ãå¥ã®ããã°ã©ããŒã«ããéšåçãªãªãã¡ã¯ã¿ãªã³ã°ãæ¢ã«è¡ãããŠãããšããäºå®ã«ããããããã åãã å¯äžã®ããšã¯ããã¬ãŒã ã¯ãŒã¯ã䜿çšãããªãã£ãããšã§ãã ãã¡ãããããã¯åžžã«ã€ãšã¹ãã¢ãã¡ããfleymovy質åã§ããïŒ ã§ããããšããŸãã¯ã§ã¯ãããŸãããïŒ UnixãŸãã¯WindowsïŒ äœ¿çšãããããªãã ç§èŠãç§ã®æèŠïŒãã¬ãŒã ã¯ãŒã¯ã¯å žåçãªã¿ã¹ã¯ã®çãåã®ããã«ç ãæŸãŸãããŠããŸãã ãœãŒã·ã£ã«ãããžã§ã¯ãã¯éåžžãå žåçãªã¿ã¹ã¯ã§ã¯ãããŸãã...ããããäžè¬çã«ããããžã§ã¯ãã¯ç§ã«ãšã£ãŠé¢çœããã«æããã®ã§ãæ¹åã«åãçµãããšã«ããŸããã ãã®ãšã³ããªã§ã¯ãå®äºããããšãã§ããŸã...
ããããããã®åéã§å°ãªããšãäœããç¥ã£ãŠããæ zyãªWEBéçºè ã ãããããã©ãŒãã³ã¹ã®åäžãšé«è² è·ã®ãããã¯ã«ã€ããŠæžããŠããŸããã åºæ¬çã«ãæ°ããäœããããã®èšäºã§ã¯ãããªãã¯èŠã€ããããšãã§ããŸããã é«è² è·ãããžã§ã¯ããéçºããããã®äž»ãªã¢ã€ãã¢ã¯ãäžé£ã®HighLoadèšäºã§æŠèª¬ãããŠããŸãã 3é ã®ã¯ãžã©ã ã NoSQL tarantoolãªããžããªã䜿çšããŠPHPãããžã§ã¯ãã®çç£æ§ãåäžãããæ¹æ³ã«èå³ãããå Žåã¯ãcatã«ããããã
ååãšããŠããã®ç¯å²ã®ã¿ã¹ã¯ã«é©ããå¥ã®ããŒãå€ã®ã¹ãã¬ãŒãžãããã³ãµãŒããŒããžãã¯ã®å®è£ ã¯ãä»ã®ã¹ã¯ãªããèšèªã§ã䜿çšã§ããŸãã
ã¬ã·ã1.ã³ãŒããåæ
ãã¹ãŠãæãããæ±ãã 圌ãã¯ç§ã®åã«ãã®äœçŸåãæžããŠãããããã«äœçŸãã®èšäºãæžãããŸã...ãããããç§ãã¡ã¯æãè³¢ãããšåãçæãçå®ã«èžãã§ããŸãã ãã¹ãŠã®WEBãããžã§ã¯ãã®99ïŒ ã®ããã«ããã¯ãããŒã¿ããŒã¹ã§ãããšèšã£ãŠããã¢ã¡ãªã«ãçºèŠããããšã¯ã§ããŸããã ãããŠãããã®ãã¡ã©ããçµè«ä»ããå¿ èŠããããŸããïŒ
ããã§ã- ã¯ãšãªã®æ°ãæå°éã«æããå¿ èŠããããŸãã ã ãããŠãã©ã®ããã«ããžãã¯ã®éçšã§5åã³ãŒããæºãããŠããå Žåããããè¡ãã«ã¯ïŒ
$ãŠãŒã¶ = æ°ãããŠãŒã¶ãŒïŒïŒ;
$ userData = $ user- > getById ïŒ $ uid ïŒ ;
ã¯ãšãªã®ãããã¡ã€ãªã³ã°æã«ã5ã€ã®åäžã®ãéžæããå®è¡ããããšãããããŸããSELECT * FROM users WHERE id = $ uid;
ããã¯éåžžã«ç°¡åã«å®è£ ãããŸããå éšïŒãã©ã€ããŒãïŒéçãã£ãŒã«ããŸãã¯Userãªããžã§ã¯ãã®ããããã£ã䜿çšããŸãã
ã¯ã©ã¹ãŠãŒã¶ãŒ {
ãã©ã€ããŒãéç$ã®userData = NULL;
ãã©ã€ããŒã é¢æ° getById_loc ïŒ $ uid ïŒ {
ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããããã®ããã€ãã®ã³ãŒãã//ã
}
ãããªã㯠é¢æ° getById ïŒ $ uid ïŒ {
if ïŒ self :: $ userData ïŒ return self :: $ userData ;
self :: $ userData = $ this- > getById_loc ïŒ $ uid ïŒ ;
èªå·±ã è¿ã :: $ ã®userDataã
}
}
ããã«ç®ãåŒãã®ã¯2çªç®ã§ãã ããã¯ã2ã€ã®æ¹æ³ãè¿ãã«ããå Žåã§ãã
$ User- > updateBalance ïŒ $ sum ïŒ ;
$ User- > updateRating ïŒ $ rating ïŒ ;
ããã«ãããé£ç¶ããŠ1ã€ã®ããŒãã«ã«å¯ŸããŠ2ã€ã®ã¯ãšãªãå®è¡ãããŸãã
UPDATEãŠãŒã¶ãŒã®SETãã©ã³ã¹=ãã©ã³ã¹+ $ã®åèšWHERE ID = $ã®UIDã
UPDATEãŠãŒã¶ãŒSET rating = $ rating WHERE id = $ uid;
ãã ããé ãå°ãåããã°ã1ã€ã®ãªã¯ãšã¹ããäœæã§ããŸãã
ãŠãŒã¶ãŒã»ããã® æŽæ°
ãã©ã³ã¹=ãã©ã³ã¹+ $ åã
è©äŸ¡= $è©äŸ¡
ID = $ã®UIDã
ããã¯2ã€ã®æ¹æ³ã§è¡ãããšãã§ããŸãïŒå¥ã®ã¡ãœãã$ user-> updateBalanceAndRatingïŒ$ sumã$ ratingïŒãæžããããã¹ãŠã®å Žé¢ã§åœŒããèšãããã«æ®éçãªäœããå®è£ ããŸãïŒ
$ãŠãŒã¶- > updateFieldAddïŒ 'ãã©ã³ã¹ 'ã$åèšïŒã //ãã£ãŒã«ããèšæ¶ããæäœãè¿œå -è¿œå ããªãã©ã³ã
$ãŠãŒã¶- > updateFieldAssignïŒ 'è©äŸ¡ 'ã$å®æ ŒïŒã //ãã£ãŒã«ããå²ãåœãŠæäœ-å²ãåœãŠããªãã©ã³ããèšæ¶ããŸã
$ user- > execUpdate ïŒ ïŒ ; //ãªã¯ãšã¹ããäœæããŠå®è¡ããŸã
ãããã®2ã€ã®ç°¡åãªæ¹æ³ã®å¯äžã®å°å ¥ã¯10-12 3ãã5ã«ããŒã¿ããŒã¹ã¯ãšãªã®æ°ãåæžããããšãå¯èœãšãªããŸããã ããããæ£çŽãªãšããããŸã æ¢åã®ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ãªãã¡ã¯ã¿ãªã³ã°ããããŸãã ãã¡ãããã»ãšãã©ã®Habrousersã¯æè ãšã¯ã»ã©é ãã§ããããããã¡ã€ãªã³ã°ãšåæã¯åžžã«ãç¥ãç§ãã¡ãå©ããŠãããŸããã
ã¬ã·ã2.ãã£ãã·ã³ã°
ãã£ãã·ã³ã°ãšã¯äœã§ãããæ£ãã°ãå¿ èŠã¯ãããŸããã Dima Koterovãé«è² è·ãããžã§ã¯ãã®éçºã«é¢ããèšäºã§æžããããã«ããã§ããéããã¹ãŠããã£ãã·ã¥ããå¿ èŠããããŸããã ãã®ãããžã§ã¯ãã§ã¯ãããçš®ã®ãã£ãã·ã³ã°ã®tiç ãªè©Šã¿ããããŸããã ããããChernomyrdinã«ãããšããã¹ãŠãå€æããŸããã圌ãã¯ãæãé »ç¹ã«äœ¿çšããããã®ã§ã¯ãªããæé«ã®ãã®ãæã¿ãŸãããããã£ãã·ã¥ããŸããã
äžèšotmechenonoããã«ãããŒã¿ããŒã¹ã®è² è·ã軜æžããããã«ã¯ããªã¯ãšã¹ãã®æ°ãäœæžããå¿ èŠããããŸãã ãããŠãããããæžããæ¹æ³ã¯ïŒ ã¯ããããã¯éåžžã«ç°¡åã§ã-ããšãã°ãèšå®ã§ãããŒã¿ããŒã¹ããäžå€ããŒã¿ã®äžéšïŒãŠããããããªãã¥ãŒããæŠåšã®ããã¥ã¢ã«ïŒãç°¡åã«åé€ã§ããŸãã æ§æã¯XMLã§ãããä»»æã®XMLãšãã£ã¿ãŒã§ã²ãŒã ãã¬ã€ããŒã ã®å¥³ã®åãç·šéããããå®æãã圢åŒïŒPHPé åïŒã§ç·šéã§ããŸã-ã²ãŒã ãã¬ã€ãšã³ãŒãã®éçºè ã1人ã®å Žåã ãã®å Žã§ParsingXMLãå®è¡ããã®ã¯é£ããã®ã§ãäºåçãªXSLTå€æãçŽæ¥PHPã³ãŒãã«ïŒã¡ã€ã³ã³ãŒããšå ±ã«èªã¿èŸŒãŸããé£æ³é åã®åœ¢åŒã§ïŒè¡ããŸãã ãã ããXMLæ§æãã¡ã€ã«ãå€æŽãããã³ã«ãXSLTå€æã¹ã¯ãªãããŸãã¯ã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãå®è¡ããå¿ èŠããããŸãã ã¯ããããã¯ãã£ãã·ã³ã°ã§ã¯ãããŸãããããã¯ããããªæ¹åã§ãããå¥ã®ã¬ã·ããšããŠå²ãåœãŠãããšã¯ã§ããŸããããå¿ããªãã§ãã ããã
ãããã£ãŠããã¹ãŠã®ãã£ã¬ã¯ããªãæ§æã«è©°ã蟌ãã ã®ã§ãããã«ããã€ãã®ã¯ãšãªãã解æŸãããŸãã ãŸããäœ-ããã¯ç°¡åã«ãªããŸãããïŒ..å°ãªããšãã¬ã·ã1ãš2ãé©çšããåŸãããŒã¹ã¯èœã¡ãªããªããŸããã ãŸããå°ãªããšãããã€ãã®çµæ...
ã¬ã·ã3.ããŒã¿åæ
ããã§ããªãã¯æ¬åœã«ã³ãŒããåæããèããªããã°ãªããŸãã...ãããŠããšããã§ãäœãããããŸã...ãŠãŒã¶ãŒãã©ã®ããŒã¿ãå€æŽããã©ã®ãŠãŒã¶ãŒããŒã¿ãå€æŽããããæãé »ç¹ã«èŠæ±ãããã®ããç¥ãå¿ èŠããããŸãã ããã§ã¯ãèŠèŠçã«ã³ãŒããå®è¡ãããããžã§ã¯ãã®ããžãã¯ãç解ããããšãå¿ èŠã§ãã
ç§ãã¡ã®ãããžã§ã¯ãã§æãé »ç¹ã«ãªã¯ãšã¹ããããæ å ±ã¯ããŠãŒã¶ãŒã®ã²ãŒã ãããã£ãŒã«ãã®ãããè³ã§ãã ãã®ããŒã¿ã¯ãã¹ãŠNoSQLã¹ãã¬ãŒãžã«é 眮ãããä»ã®ãã¹ãŠã®ããŒã¿ãç¹ã«æ¯æãã«é¢é£ããããŒã¿ã¯MySQLã«æ®ããŸããã NoSQLãªããžããªãšããŠãtarantoolãéžæãããŸããã
ãããŠãŸã -ãªãTARANtoolãªã®ãïŒ
Highload ++ Conference 2011ã§ã¯ãTarantooléçºãããŒãžã£ãŒã®Kostya Osipovaã«æ¬¡ã®è³ªåããããŸããã
-ãªãããªãã®ååã¯ãããªã«ææ¯ã§ããïŒ
-ãŸããããªãã¯ååãã©ã ãšããŒã«ãã€ãŸã ãããžã§ã¯ããçªã£èŸŒãããã®ããŒã«ïŒããŒã«ïŒãšããŠã
ãããã£ãŠãNoSQLã¹ãã¬ãŒãžã®éžæã«åœ±é¿ããèŠå ã¯æ¬¡ã®ãšããã§ãã
-ãµããŒããšã³ã³ãµã«ãã£ã³ã°ãçŽæããKostya Osipovãããžã§ã¯ãã®ããŒã ãªãŒããŒãšã®å人çãªç¥ãåã
-以åã®ãããžã§ã¯ãã§ãã®ãªããžããªãå®è£ ããçµéšã æ®å¿µãªããšã«ããããžã§ã¯ãã¯:(ãé¢éžããŸããã§ããããèå³æ·±ããã®ã§ããã
- 2幎è¿ããã®å䜿çšåŸã«ãæ°ããªæ©äŒãtarantoolãæ¢ããŸã
-ãã®NoSQLã¹ãã¬ãŒãžã®é«ãããã©ãŒãã³ã¹ãšé«ãããŒã¿å¯çšæ§ã
-ããŒã¿ã®æ°žç¶æ§ããã£ã¹ã¯ã«ãããããããå Žåãåžžã«çºçããå¯èœæ§ã®ããå®éã®ã³ããŒããããŸãã
-ããŠãããŸãæ§ããã§ã¯ãªãããç§èªèº«ã¯Tarantoolã®PHPæ¡åŒµã®æåã®ããŒãžã§ã³ã®äœæè ãªã®ã§ãå¿ èŠã«å¿ããŠäœãã«ããããåœãŠããããã°ãä¿®æ£ãããã§ããŸãã
ããããããæ·±å»ãªããšã«ããã®NoSQLããŒã¿ãŠã§ã¢ããŠã¹ã®ãŠããŒã¯ãªæ©èœãæ°ã«å ¥ã£ãŠããŸããã»ã«ã³ããªããŒã䜿çšããã¹ãã¢ãããã·ãŒãžã£ã䜿çšããŠãµãŒããŒåŽã§ããŒã¿é åãæäœããŸãã
ããŒã¿åæïŒç¶ãïŒ
ãŠãŒã¶ãŒãããã¡ã€ã«ããŠãŒã¶ãŒããŒãã«ã«ã€ããŠèããŸãã å¯å€ããã³å¯å€ã®ããŒã¿ããããŸãã å¯å€ããŒã¿ã«ã¯ããã©ã³ã¹ãè©äŸ¡ãpvpãã€ã³ããåäœããã¥ãŒããªã¢ã«ã¹ããããªã©ãå«ãŸããŸãã
å€æŽäžå¯èœãªããŒã¿ã«ã¯ãsocial_idããã°ã€ã³ãã¢ãã¿ãŒurlãå人ã³ãŒããªã©ãå«ãŸããŸããå¯å€ããŒã¿ã®äžã«ã¯ãå€ãã®å Žåãå¯å€ã§ã»ãšãã©å€æŽãããŸããã ãã ããäžæ®çºæ§ããŒã¿ãé »ç¹ã«èŠæ±ãããå ŽåããããŸãã
é »ç¹ã«èŠæ±ãããããŒã¿ã匷調衚瀺ããŸãã ããããtarantoolã«ãã£ãã·ã¥ããŸãã NoSQLã¹ãã¬ãŒãžèªäœã«ã€ããŠå°ã説æããŸã...
TARANtoolã ã·ããã·ã¹
Tarantoolã¯ãäžèšã®ããã«ãé«æ§èœãªããŒ/ããªã¥ãŒNoSQLã¹ãã¬ãŒãžã§ãã ãã¹ãŠã®ããŒã¿ã¯RAMå ã«ãããã¿ãã«ã®åœ¢åŒã§è¡šç€ºãããããããããã®æœåºé床ã¯redisã«å£ã£ããããããã«é ãïŒ1000æäœããã6ã7ããªç§ïŒmemcachedã§ãã
ããã§ããTarantoolã¯ããŒã¿ãŠã§ã¢ããŠã¹ã§ãããmemcacheãªã©ã®ã¡ã¢ãªå ã®ãã£ãã·ã¥ã·ã¹ãã ã§ã¯ãªãããšã«æ³šæããŠãã ããã ãã¹ãŠã®ããŒã¿ã¯RAMã«ãããŸããããã¡ã€ã«ïŒã¹ãããã·ã§ãã0000..01.snapïŒã«åžžã«ä¿åãããŸãïŒåæã·ã¹ãã ã³ãŒã«ããåæãããŸãïŒã åŸæ¥ã®memcachedããã³redisãšã¯ç°ãªããtarantoolã«ã¯è¿œå æ©èœããããŸãã
-ããŒã¿ã«ã»ã«ã³ããªã€ã³ããã¯ã¹ããªãŒããŒã¬ã€ããæ©èœ
-ã€ã³ããã¯ã¹ã¯åæå¯èœ
-ã€ã³ããã¯ã¹ã®ã¿ã€ãã¯ãHASHãTREEããŸãã¯BITSETã§ãã GEOã€ã³ããã¯ã¹ã®å°å ¥ãèšç»ãããŠããŸãã
-1ã€ä»¥äžã®ã€ã³ããã¯ã¹ã®åæãµã³ããªã³ã°ã
-éšåçãªããŒã¿æœåºïŒLIMIT / OFFSETã®ã¢ããã°ïŒã
Tarantoolã¯ãã¹ããŒã¹ã«çµåãããããŒã¿ãæäœããŸãã ã¹ããŒã¹ã¯MySQLã®ããŒãã«ã«é¡äŒŒããŠããŸãã Tarantoolã¯ãããžã¿ã«ã¹ããŒã¹çªå·ïŒ0ã1ã2ã3 ...ïŒã䜿çšããŸãã è¿ãå°æ¥ãããŒã ã¹ããŒã¹ïŒMySQLã®ããŒãã«åã®é¡äŒŒç©ïŒã䜿çšããäºå®ã§ãã
åã¹ããŒã¹ã«ã€ã³ããã¯ã¹ãéããããšãã§ããŸãã ã€ã³ããã¯ã¹ã¯ãæ°å€ïŒint32ãŸãã¯int64ïŒãšæåãã£ãŒã«ãã®äž¡æ¹ã«éãåãããããšãã§ããŸãã ã¹ããŒã¹ãšåæ§ã«ãtarantoolã¯ããžã¿ã«ã€ã³ããã¯ã¹ã®çªå·ä»ããå®çŸ©ããŸãã
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ã¿ãã«éã®äº€æã è¡šMySQLã§ã¢ããã°åç·ãKortezh-ã æ°åŠã§ã¯ãè»åã®æŠå¿µ - é·ãnã®é åºä»ãæééåã ã¿ãã«ã®åèŠçŽ ã¯ã ããŒã¿èŠçŽ ãŸãã¯ãã£ãŒã«ããè¡šããŸãã åºæ¬çã«ãã¿ã©ã³ãã¥ã©ã¯ãã£ãŒã«ãã®ããŒã¿åãåºå¥ããŸããã 圌ã«ãšã£ãŠãããã¯äžé£ã®ãã€ãã§ãã ããããã€ã³ããã¯ã¹ã䜿çšããå Žåãã€ãŸã ãã®ãã£ãŒã«ãã«ã€ã³ããã¯ã¹ã課ãå Žåããã®ã¿ã€ãã¯ãã£ãŒã«ãã®ã¿ã€ããšäžèŽããå¿ èŠããããŸãã ã¿ãã«ã«ã¯å¥ã®ååããããŸãïŒtupleã
ãã¹ãŠã®ã€ã³ããã¯ã¹ã¯ã人éã®ç¥èŠã§ããYAMLãšããèšå®ã«ç»é²ãããŸãã èšå®ã®äžéšã®äŸïŒ
ã¹ããŒã¹[ 0 ] .enabled = 1
ã¹ããŒã¹[ 0 ] .index [ 0 ] ã ã¿ã€ã = "HASH"
space [ 0 ] .index [ 0 ] .unique = 1
ã¹ããŒã¹[0] .INDEX [0] [0] .fieldno = 0ã .key_field
ã¹ããŒã¹[ 0 ] .index [ 0 ] .key_field [ 0 ] ã ã¿ã€ã = "NUM"
æ§æã§ã¯ãåã¹ããŒã¹ã®ãã©ã€ããªã€ã³ããã¯ã¹ãšã»ã«ã³ããªã€ã³ããã¯ã¹ãèšè¿°ããŸãã PRIMARY KEYã®ã¿ã§éžæããå Žåããã©ã€ããªã€ã³ããã¯ã¹ã®ã¿ã®èª¬æã§ååã§ãïŒäžèšã®äŸãåç §ïŒã ãŠãŒã¶ãŒéã®ã¬ãŒãã£ã³ã°ãŸãã¯pvpããã«ã§æé©ãªãã®ãéžæããå Žåããããã®ãã£ãŒã«ãã«ã»ã«ã³ããªã€ã³ããã¯ã¹ã課ããŸãã 第2ã®ãã£ãŒã«ããã€ã³ããã¯ã¹ãããŠã¿ãŸãããïŒfieldno = 1ããŒãããæ°ããŠïŒint32_t - è©äŸ¡ïŒ
ã¹ããŒã¹[ 0 ] .index [ 1 ] ã ã¿ã€ã =ãTREEã㯠//ããªããããå°ãªãæäœããµã³ããªã³ã°ããããšãå¯èœã«ããã¿ã€ãã»ããªãŒããäœããŸã
space [ 0 ] .index [ 1 ] .unique = 0 //ç¬åµæ§ãåé€
space [ 0 ] .index [ 1 ] .key_field [ 0 ] .fieldno = 1 //ã€ã³ããã¯ã¹ä»ããã£ãŒã«ãã®çªå·ã瀺ããŸã
ã¹ããŒã¹[ 0 ] .index [ 1 ] .key_field [ 0 ] ã type = "NUM" // int32_tãšå ¥å
Social Gameãããžã§ã¯ãããããããäž»ããŒã¯social_idã«å¯Ÿå¿ããŸãã ã»ãšãã©ã®ãœãŒã·ã£ã«ãããã¯ãŒã¯ã§ã¯ãããã¯64ããŒã§ãã ã€ã³ããã¯ã¹ã¿ã€ãã¯HASHã«ãªããããŒã¿ã¿ã€ãã¯STRã«ãªããŸãã çæ³çã«ã¯NUM64ã欲ããã®ã§ãããæ®å¿µãªããPHPã¯long longåã§ã¯ããŸãæ©èœããŸããã ãã©ã€ããŒã¯ã䜿çšãããŠããã¹ããŒã¹ã®äž»ããŒã®ã¿ã€ããšãµã€ãºãèªèããŸããã çŸæç¹ã§ã¯ã64ãããããŒã䜿çšããŠããå Žåã32ãããå€ã䜿çšããŠæ€çŽ¢ããããšã¯ã§ããŸããã ããã¯ã64ãããã®ããŒãšããŠããã±ãŒãžã«æ¢±å ãããªããã°ãªããŸããã çŸåšããã©ã€ããŒã¯ãå€ã32ãããã®ç¯å²ãè¶ ããŠããå Žåã«ã®ã¿ãããè¡ããŸãã ãããã£ãŠãã¿ã€ãSTRINGã䜿çšããæ¹ãä¿¡é Œæ§ãé«ããªããŸãã
ã¡ã¢ãªèšç®
tarantoolã¯ã¡ã¢ãªã®ã¿ã®ãœãªã¥ãŒã·ã§ã³ã§ããããã䜿çšãããRAMã®æšå®éãèšç®ããããšãéèŠã§ãã èšç®ã¯æ¬¡ã®ãšããã§ãã
åã¿ãã«ã®åã«ãvarintåã®å€æ°ïŒããã¯å ã®perl 'w'ã®ã¢ããã°ïŒãšåã¿ãã«ã®ããããŒãã12ãã€ããæ ŒçŽãããŸãã å ·äœçã«ã¯ãããŒã¿ã«ã€ããŠã¯ã ãããã³ã«ã調ã¹ããã Tarantool Data and Protocolã®èšäºãèªãããšã§èŠã€ããããšãã§ããŸãã
ããã«ãçŽ15ïŒ ãã¢ãã±ãŒã¿ãŒã®ããŒã¿ã§å æãããŠããŸãã ããšãã°ã10åã®ãã£ãŒã«ããããããŠãŒã¶ãŒããŒã¿ã®ãµã€ãºã256ãã€ãã«åãŸãå Žåã1.5Mã®å Žåãããã次ã®èšç®ãè¡ãããŸãã
ïŒ10 * 1 + 256 + 12ïŒ* 1.15 * 1 500 000 = 921150000ã= 440 Mb /æ¥
åæ§ã«ãã¡ã¢ãªå ã®ãã¹ãŠã®ã€ã³ããã¯ã¹ãä¿æããŠããŸãïŒ
-ããªãŒå ã®1ã€ã®ããŒãã«ã¯ã68ãã€ãã®ãµãŒãã¹æ å ±ãæ ŒçŽãããŸã
-1ã€ã®ããŒãã«ã€ããŠã56ãã€ãã®ãªãŒããŒãããæ å ±ãããã·ã¥ã«ä¿åãããŸã
150äžäººã®ãŠãŒã¶ãŒã«ã€ã³ããã¯ã¹ãä¿åããã«ã¯ãåèšã§80Mbãè¶ ããã ãã§ååã§ã1.5Mã®ãããã¡ã€ã«ãä¿åããã®ã«ããããã«ååã®ã¬ãã€ããå¿ èŠã«ãªããŸãã æã ã¯å¥ã®ããŒïŒã¿ã€ãTREEïŒãè¿œå ããå Žåãããã¯ããã«90Mã®RAMã§ãã
ãã®ãããªäººãããŸãããä»æ¥ã®åºæºã§ã¯ãããã»ã©å€ãã¯ãããŸããã
ã¬ã·ã4.ãã©ã¢ã°ã©ãŠã³ãã§MySQLãåãé€ã
ãã§ã«è¿°ã¹ãããã«ããŠãŒã¶ãŒãããã¡ã€ã«ããŒã¿ãtarantoolã«è»¢éãããšããçŸåšã®ã³ããŒãMySQLã«ä¿æããããšèããŠããŸãã ãããã£ãŠãUPDATEã«é¢é£ãããã¹ãŠã®æäœãå®è¡ããå¿ èŠããããŸãã ãã®çµæããã£ãã·ã³ã°ãè¡ã£ãŠããããŸãéæã§ããŸããã§ããã ãããã圌ãã¯ãŸã äž»ãªå¹æãéæããŸããïŒMySQLã¯èœã¡ãªããªããŸããã ããã§ã¯ãã©ãããã°ã¹ã¯ãªãããæ°åé«éåã§ããŸããïŒ ããã¯ãMySQLã¯ãšãªããŸã£ããåé€ããå Žåã«å¯èœã§ãã ããã¯ã©ã®ããã«å¯èœã§ããïŒ ããŒã¿ããŒã¹ãžã®å€æŽã«é¢ããæ å ±ããINSERT / UPDATEæäœãå®è¡ããä»ã®ããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã«è»¢éããå¿ èŠããããŸãã
ãã®æ å ±ã¯ãã¥ãŒãä»ããŠéä¿¡ãããŸãã ãªã¢ãŒãã¿ã¹ã¯ã®å®è¡ãå¯èœã«ããããã€ãã®ç£æ¥çšãœãªã¥ãŒã·ã§ã³ããããŸããGaermanãCeleryãããã³RabbitMQãZMQãredisããã®ä»ã®ãã¥ãŒãµãŒããŒãé©å¿ãããããšãã§ããŸãã ãã¥ãŒãµãŒããtarantool䜿çšããããšãã§ããå Žåã§ãããªãããããžã§ã¯ãã«ããã€ãã®æ°ãããšã³ãã£ãã£ã玹ä»ã
ã¿ã©ã³ãã¥ã©ã«ã¯github.com/mailru/tntlua/blob/master/queue.luaãã¥ãŒã®å®è£ ãããã䜿çšããããšããå§ãããŸãã
ãã ããå°ãç°¡åã«å®è£ ãããŸããã æ°ããã¹ããŒã¹ãäœæããŸãã
space [ 1 ] .enabled = 1
space [ 1 ] .index [ 0 ] ã ã¿ã€ã = ãTREEã
space [ 1 ] .index [ 0 ] .unique = 1
ã¹ããŒã¹[1] .INDEX [0] [0] .fieldno = 0ã .key_field
space [ 1 ] .index [ 0 ] .key_field [ 0 ] ã ã¿ã€ã = "NUM"
ãã®ã¹ããŒã¹ã§ã¯ã次ã®ãã£ãŒã«ããèšè¿°ããŸãã
-idãèªåã€ã³ã¯ãªã¡ã³ããã£ãŒã«ãã ã€ã³ããã¯ã¹ãå¿ èŠã§ãã ã¿ã€ãTREEã®ãã©ã€ããªã€ã³ããã¯ã¹ãã¹ãŒããŒã€ã³ããŒãºãããŸãã
-type-æäœã®ã¿ã€ããSQLæŒç®åã®ãã¿ãŒã³çªå·ã決å®ããæ°å€å®æ°ã
-ããŒã¿-æ¿å ¥/æŽæ°ããããŒã¿ã
åæ¯ã¹ã¯ãªããã«ã¯æ¬¡ã®ã³ãŒããå«ãŸããŸãã
define ïŒ 'UPDATE_SPIN_COUNT' ã 1 ïŒ ;
define ïŒ 'UPDATE_USER_BALANCE' ã 2 ïŒ ;
...
$ res = $ tnt- > call ïŒ 'box.auto_increment' ãarray ïŒ ïŒ string ïŒ TBL_QUEUES ã UPDATE_SPIN_COUNT ã$ spinCountã$ uid ïŒ ïŒïŒ ;
ã¹ãã¢ãããã·ãŒãžã£box.auto_incrementã¯çµã¿èŸŒã¿ã§ãããã¿ãã«ããŒã¿ãæ¿å ¥ããŸã;äž»ããŒã®å€ã¯max + 1ã§ãããã©ã¡ãŒã¿ãŒïŒ
-ããŒã¿ãæ¿å ¥ãããã¹ããŒã¹ã®æ°
-ããŒã¿èªäœ
-ãªãã·ã§ã³ã®ãã©ã°ãã©ã¡ãŒã¿ãããã©ã«ãã§ã¯ãreturn new keyãã«èšå®
å€æ°ã®åã§ããã¹ããŒã¹ã®æ°ïŒå®æ°TBL_QUEUES ïŒã¯ã STRINGåã«ãã£ã¹ãããå¿ èŠãããããšã«æ³šæããŠãã ããã ãã®ã¹ã¯ãªããã¯ãFIAãã¥ãŒã«ããŒã¿ãæžã蟌ãluaããã·ãŒãžã£ãåŒã³åºããŸãïŒèªåã€ã³ã¯ãªã¡ã³ãçªå·ãå®è¡äžã®ã¿ã¹ã¯ã®ã¿ã€ããããã³ããŒã¿èªäœïŒã
次ã«ãå¥ã®ãªã¢ãŒããã·ã³äžã§ãå®è¡ã§ããããã¯ã°ã©ãŠã³ãã¹ã¯ãªããããã¥ãŒããããŒã¿ãååŸããSQLãå®è¡ããŸãã
define ïŒ 'UPDATE_SPIN_COUNT' ã 1 ïŒ ;
define ïŒ 'UPDATE_USER_BALANCE' ã 2 ïŒ ;
...
$ res = $ this- > callProc ïŒ 'my_pop' ãarray ïŒ ïŒ string ïŒ TBL_QUEUES ïŒ ïŒ ;
/ *
空ã®å Žåã¯ä»¥äžãè¿ããŸãïŒ
é åïŒ 2 ïŒ {
[ "count" ] => int ïŒ 0 ïŒ
[ "tuples_list" ] =>é åïŒ 0 ïŒ { }
}
* /
ããïŒ$ RES [ 'count'ãšãã ïŒ]ïŒã®ãªã¿ãŒã³;
$ tuple = $ res [ 'tuples_list' ] [ 0 ] ;
switch ïŒ $ tuple [ 1 ] ïŒ {
ã±ãŒã¹UPDATE_SPIN_COUNTïŒ
$ sql = "UPDATE users SET spinCount = {$ tuple [2]} WHERE uid = {$ tuple [3]}" ;
äŒæ© ;
ã±ãŒã¹UPDATE_USER_BALANCE ïŒ
$ sql = "UPDATE users SET money = money + {$ tuple [2]} WHERE uid = {$ tuple [3]}" ;
äŒæ© ;
ããã©ã«ãïŒ
æ°ããäŸå€ïŒãunknowã¿ã¹ã¯ã®çš®é¡ãæããŸã ãïŒ;
äŒæ© ;
}
ã®$ this - > ExecSqlã®ïŒ$ sqlãïŒ ;
ãã®çµæãããã³ããšã³ãã¹ã¯ãªããã¯é«éã®ã¿ã©ã³ãã¥ã©ã§ã®ã¿åäœããããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã¯ããŒã¢ã³ãšããŠãã³ã°ããããã¯ã©ãŠã³ã§å®è¡ãããWEBãµãŒããŒã®ãªãœãŒã¹ãç¡é§ã«ããããšãªãMySQLã®ããŒã¿ãå¥ã®ãµãŒããŒã«ä¿åããŸãã ãã®çµæãçç£æ§ã§30ïŒ ä»¥äžåã€ããšãã§ããŸãã ããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã®ããŒãã¯å¥ã®èšäºã«å€ããŸãã
ãã ããããã ãã§ã¯ãããŸããã luaããã·ãŒãžã£my_popãéå§ããã«ã¯ãåæåããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã次ã®ã³ãŒããinit.luaãã¡ã€ã«ã«é 眮ããwork_dirãŸãã¯script_dirã«é 眮ããå¿ èŠããããŸãã
é¢æ° my_pop ïŒ spaceno ïŒ
spaceno = tonumber ïŒ spaceno ïŒ
local min_tuple = box.space [ spaceno ] .index [ 0 ] .idxïŒ min ïŒ ïŒ
ããŒã«ã« æå° = 0
min_tupleã = nilã® å Žå
æå° =ããã¯ã¹ã ã¢ã³ããã¯ ïŒ 'i' ãmin_tuple [ 0 ] ïŒ
ä»ã«
åž°ã
çµãã
ããŒã«ã« ret = box.select ïŒ spacenoã 0 ã min ïŒ
box.delete ïŒ spacenoã min ïŒ
æ»ã
çµãã
work_dirã®å€ã¯ãtarantool.confã§æå®ãããŸãã
ã¬ã·ã5.ã¢ã¯ãã£ãã«åçãããŠãããããã¡ã€ã«ã®ã¿ããã£ãã·ã¥ãã
æ¢ã«ä»¥åã«å®è£ ããããã«ããã¹ãŠã®ãããã¡ã€ã«ã¯tarantoolã«ä¿åãããããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã«ãã£ãŠè¡ããããã¹ãŠã®å€æŽã¯MySQLã«èšé²ãããŸãã CAPå®çã«åŸã£ãŠãå°ãé ããŠé¢é£ããŒã¿ãåžžã«ãããŸãã
ãããããããžã§ã¯ãã150äžäººã ãã§ãªã300äžäººãŸãã¯500äžäººã®ãŠãŒã¶ãŒãç²åŸããå Žåã¯ã©ãã§ããããã ãŠãŒã¶ãŒããã°ã€ã³ããã²ãŒã ã¯å¥œãã§ã¯ãªãã£ã-å·Šã ããããã¿ã©ã³ãã¥ã©ã®ããŒã¿ã¯æ®ããã¡ã¢ãªãå æãã䜿çšãããŸãã...ãããã£ãŠãããå¹ççã«äœ¿çšããããé«éãªããŒã¿æ€çŽ¢ã®ããã«ãåžžã«ãã¬ã€ããŠãããŠãŒã¶ãŒã®ã¿ãä¿åããã®ãçã«ããªã£ãŠããŸãã
ã€ãŸãããã¬ã€ããŠããªããŠãŒã¶ãŒãã€ãŸã ç§ãã¡ã¯ãäŸãã°ãäžé±é以äžãéçšãã£ãã·ã¥ããåé€ããããšãã§ããéã³ã«æ¥ãŸããã§ããã ããŒã¿ããŒã¹ã«å®éã®ã³ããŒãããããããã€ã§ãæäœå¯èœãªãã£ãã·ã¥ã«åŸ©å ã§ããŸãã ãªã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããã¯ã©ã¹ã®ã³ãŒãã¯ããã£ãã·ã¥ã®æšæºã¿ã€ãã«åŸã£ãŠæ§ç¯ãããŸãã
ã¯ã©ã¹ User 㯠DbModelãæ¡åŒµããŸã{
ãããªã㯠é¢æ° getByUidïŒ$ã® UIDïŒ{
$ result = this- > getFromCache ïŒ $ uid ïŒ ;
ïŒããïŒIS_NULLïŒ$çµæïŒ ïŒ{
return $ result ;
}
$ result = $ this- > execSQL ïŒ "SELECT * FROM users WHERE uid = $ uid " ïŒ ;
$ this- > setToCache ïŒ $ result ïŒ ;
return $ result ;
}
....
}
ããããããã«ããããã€ãã®æ¹æ³ããããŸãïŒ
-ã¹ã¯ãªããã䜿çšããŠããŒã¿ããŒã¹ãããã¹ãŠã®ãæéåããã¬ã³ãŒãã®ãªã¹ããéžæããã¿ã©ã³ãã¥ã©ã§ããããåé€ããŸã
-ã¿ã©ã³ãã¥ã©ã«ã¯ãªãŒãã³ã°ãããŒã«ãŒãèšå®ããŸããïŒåœŒã¯èªåã§ãããªãã£ãïŒ github.com/mailru/tarantool/wiki/Brokers-ru
-ãã¹ãŠã®ãæéåããã¬ã³ãŒããåé€ããã¯ã©ãŠã³ã§åŒã³åºããå®è¡ããããã«ãluaã§ã¹ãã¢ãããã·ãŒãžã£ãèšè¿°ããŸãã
ãã¹ãŠã®ããŒã¿ïŒã¿ãã«ïŒããã£ã¹ã¯ããRAMã«ã¬ã€ãºãããã®ã§ã¯ãªããæãèŠæ±ã®å€ãããŒã¿ã®ã¿ãã¬ã€ãºãããããã«ãéçºããŒã ããã®æ°ããã¿ã€ãã®ã¹ãã¬ãŒãžã楜ãã¿ã«ããŠããŸãã ãããããMongo DBã®ããã«ã ãã®åŸãã¬ã·ã5ã¯èªåçã«æ¶ããŸãã
çµè«ã®ä»£ããã«
äžèšã¯ãã¹ãŠããœãŒã·ã£ã«ãããžã§ã¯ããå®è£ ãããŠããä»»æã®èšèªïŒPHPãPerlãPythonãRubyãJavaïŒã§å®è£ ã§ããŸãã
NoSQLããŒã¿ã¹ãã¢ãšããŠéçšãã£ãã·ã¥ã¯ã次ã®åçš®ã®ä»»æã®ããŒ/å€ã¹ãã¢ã«è¿ã¥ãããšãã§ããŸãã
-memcachedãæ°žç¶æ§ã¯ãªãããã¥ãŒã®å®è£ ã«é ãæ©ãŸããå¿ èŠããããŸãããããã¯APPENDæäœã䜿çšããŠè§£æ±ºã§ããŸã
- MemBaseå€ã§ã¯ãªããéåžžã«åªããéçºãšããã®ã¯ãªãšã€ã¿ãŒã«ãã£ãŠãµããŒããããªããªã£ãŠããããã«èŠããŸãã
- memcacheDbïŒmemcacheQã®æ
-å€§æ ¹ãåºæ¬çã«ãã®æ©èœãå®è£ ãããã¹ãŠããããŸã
- TokyoTyrantãKyotoTyrant - åºæ¬çã«ãã¥ãŒã®luaæé ã§å®æœããããšãã§ããŸã
-LevelDb Daemonããã³ã人ã®ãŸãšããªéçºã å°ããªãã£ããã·ã¥ãšãã¥ãŒã¯ãã§ã«ãã±ããã«å ¥ã£ãŠããŸãã
-ã³ã¡ã³ãã§äœããæäŸãã
ããŠãçµè«ãšããŠããã·ãå°ãPRã«ã€ããŠå°ãã
æªéãå ·äœçã«ã¯å¯èœãªã¿ã¹ã¯ãçžäºäœçšãå®è£ ã®åŸ®åŠãã«ã€ããŠã¯ããDevConf 2013ãã ãœãŒã·ã£ã«ã²ãŒã ã®PHPæªé ãã§ã話ãããäºå®ã§ãã ãŸããå®äºãããããžã§ã¯ãã®çç£æ§ãåäžãããããã€ãã®æ©èœã匷調ããŠããŸãã èå³æ·±ãå Žåã¯ãã¿ã©ã³ãã¥ã©ã®ãããã¯ã«è§ŠããŸãïŒãã®ããæ祚ã䜿çšããŸããïŒãã§ã¯ãDevConf 2013ã§ãäŒãããŸãããã
PSã ãã§ã«å€ã®3æéç®ãachapotkiã¯å¯èœã§ã...ãã©ã€ããŒãã§pliiiz-ç§ã¯ããã«ä¿®æ£ããŸãã äºåã«æè¬ããŸãã