
çŸåšãPHPãšã³ã·ã¹ãã ã«ã¯TarantoolãµãŒããŒãšé£æºããããã®ã³ãã¯ã¿ã2ã€ãããŸããããã¯å
¬åŒã®PECLæ¡åŒµã§ãã Cèšèªã§æžãããŠããã PHP ã§æžãããŠããŸããç§ã¯åŸè
ã®èè
ã§ãã
ãã®èšäºã§ã¯ãäž¡æ¹ã®ã©ã€ãã©ãªã®ããã©ãŒãã³ã¹ãã¹ãã®çµæãå
±æããã³ãŒãã«æå°éã®å€æŽãå ããã ãã§3ã5åã®ããã©ãŒãã³ã¹åäžãå®çŸã§ããããšã瀺ããããšæããŸãïŒåæãã¹ãã§ïŒ).
äœããã¹ãããã®ã§ãããã?
äžèšã®å 容ããã¹ãããŸã åæ éåæã䞊åãéåæäžŠåã§å®è¡ãããã³ãã¯ã¿ã ð ãŸããã³ãã¯ã¿èªäœã®ã³ãŒãã«ãè§ŠããããããŸãããçŸåšããããå®çŸããã®ã«åœ¹ç«ã€æ¡åŒµæ©èœãããã€ããããŸãã
- â PHP çšã®é«æ§èœãªéåæãã¬ãŒã ã¯ãŒã¯ã AlibabaãBaiduãªã©ã®ã€ã³ã¿ãŒããã倧æã§äœ¿çšãããŠããŸããããŒãžã§ã³4.1.0以éãããžãã¯ã¡ãœãããç»å ŽããŸãã SwooleRuntime::enableCoroutine()ããã«ãããã1 è¡ã®ã³ãŒãã§ PHP ã®åæãããã¯ãŒã¯ ã©ã€ãã©ãªãéåæã®ãã®ã«å€æãã§ããããã«ãªããŸãã
- Async ã¯ãæè¿ãŸã§ãPHP ã§ã®éåæäœæ¥ã®ããã®éåžžã«ææãªæ¡åŒµæ©èœã§ããããªãæè¿ãŸã§ïŒæ®å¿µãªãããç§ã«ã¯åãããªãäœããã®çç±ã§ãäœè ã¯ãªããžããªãåé€ããŠããŸãããããžã§ã¯ãã®å°æ¥ã¯äžéæã§ãã䜿ããªããã°ãªããªã ãã©ãŒã¯ããã Swoole ãšåæ§ã«ããã®æ¡åŒµæ©èœã䜿çšãããšãTCP ããã³ TLS ã¹ããªãŒã ã®æšæºå®è£ ãéåæããŒãžã§ã³ã«çœ®ãæããããšã§ãéåæåäœãç°¡åã«ãªã³ã«ããããšãã§ããŸããããã¯ãªãã·ã§ã³ãéåæTCP = 1"
- â phpdbgãapcuãpthreadsãpcovãuopz ãªã©ã®ã©ã€ãã©ãªã®äœè ãšããŠæå㪠Joe Watkins ã«ããæ¯èŒçæ°ããæ¡åŒµæ©èœã§ãããã®æ¡åŒµæ©èœã¯ãPHP ã§ãã«ãã¹ã¬ããçšã® API ãæäŸããpthreads ã®ä»£æ¿ãšããŠäœçœ®ä»ããããŠããŸãããã®ã©ã€ãã©ãªã®å€§ããªå¶éã¯ãPHP ã® ZTS (Zend Thread Safe) ããŒãžã§ã³ã§ã®ã¿åäœããããšã§ãã
ã©ããã£ãŠãã¹ãããã®ã§ãããã?
å è¡æžã蟌ã¿ãã°ãç¡å¹ã«ããTarantoolã®ã€ã³ã¹ã¿ã³ã¹ãèµ·åããŠã¿ãŸãããïŒwal_mode = ãªã) ãšãããã¯ãŒã¯ãããã¡ã®å¢å (å èªã¿ = 1 * 1024 * 1024ïŒãæåã®ãªãã·ã§ã³ã¯ãã£ã¹ã¯ã§ã®äœæ¥ãé€å€ãã2 çªç®ã®ãªãã·ã§ã³ã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãããã¡ãŒããããå€ãã®èŠæ±ãèªã¿åãããšãå¯èœã«ããããã«ãã£ãŠã·ã¹ãã ã³ãŒã«ã®æ°ãæå°éã«æããŸãã
ããŒã¿ãæäœãããã³ãããŒã¯ (æ¿å
¥ãåé€ãèªã¿åããªã©) ã®å Žåããã³ãããŒã¯ã®éå§åã«ãmemtx ã¹ããŒã¹ã (å) äœæããããã®äžã§ãé åºä»ããããæŽæ°å€ (ã·ãŒã±ã³ã¹) ã®ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠãã©ã€ã㪠ã€ã³ããã¯ã¹å€ãäœæãããŸãã
ã¹ããŒã¹ã® DDL ã¯æ¬¡ã®ããã«ãªããŸãã
space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})å¿ èŠã§ããã°ããã³ãããŒã¯ãå®è¡ããåã«ã次ã®åœ¢åŒã®10,000çµã§ç©ºéãåããã
{id, "tuplе_<id>"}ã¿ãã«ãžã®ã¢ã¯ã»ã¹ã¯ã©ã³ãã ãªããŒå€ã«ãã£ãŠæäŸãããŸãã
ãã³ãããŒã¯èªäœã¯ããµãŒããŒãžã®åäžã®ãªã¯ãšã¹ãã 10,000 å (å転) å®è¡ããããããå埩çã«å®è¡ããããã®ã§ãã 5 åã®å埩éã®ãã¹ãŠã®æéåå·®ã 3%* ã®èš±å®¹èª€å·®å ã«ãªããŸã§ãå埩ãç¹°ãè¿ãããŸãããã®åŸãå¹³åçµæãç®åºãããŸããããã»ããµã®ã¹ãããã«ãé²ãããã«ãå埩ã®éã« 1 ç§éã®äžæåæ¢ããããŸãã Lua ã®ã¬ããŒãž ã³ã¬ã¯ã¿ãŒã¯åå埩ã®åã«ç¡å¹ã«ãããå®äºåŸã«åŒ·å¶çã«å®è¡ãããŸãã PHP ããã»ã¹ã¯ããã³ãããŒã¯ã«å¿ èŠãªæ¡åŒµæ©èœã®ã¿ã䜿çšããŠéå§ãããåºåãããã¡ãªã³ã°ãæå¹ã«ãããã¬ããŒãž ã³ã¬ã¯ã¿ãŒã¯ç¡å¹ã«ãããŸãã
* å転æ°ãååŸ©åæ°ããšã©ãŒãããå€ã¯ãã³ãããŒã¯èšå®ã§å€æŽã§ããŸãã
ãã¹ãç°å¢
以äžã«æ²èŒããçµæã¯ãMacBookPro (2015)ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã - Fedora 30 (ã«ãŒãã« ããŒãžã§ã³ 5.3.8-200.fc30.x86_64) ã§äœæãããŸããã Tarantoolã¯Dockerã§ãã©ã¡ãŒã¿ã--network host".
ããã±ãŒãžããŒãžã§ã³:
Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3ããã«ã a872fc2f86
PHP: 7.3.11 (cli) (ãã«ã: 22幎2019æ08æ¥ 11:04:XNUMX)
tarantool/ã¯ã©ã€ã¢ã³ã: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ 7.3 çšããã)*
ext-msgpack: 2.0.3
å€éšéåæ: 0.3.0-8c1da46
æ¡åŒµã¹ãŠãŒã«: 4.4.12
æ¡åŒµãã©ã¬ã«: 1.1.3
* æ®å¿µãªãããå ¬åŒã³ãã¯ã¿ã¯ PHP ããŒãžã§ã³ 7.2 以éã§ã¯åäœããŸããã PHP 7.3ã§æ¡åŒµæ©èœãã³ã³ãã€ã«ããŠå®è¡ããã«ã¯ã .
çµæ
åæã¢ãŒã
Tarantoolãããã³ã«ã¯ãã€ããªåœ¢åŒã䜿çšãã ã¡ãã»ãŒãžã®ã·ãªã¢ã«åçšã PECL ã³ãã¯ã¿ã§ã¯ãã·ãªã¢ã«åã¯ã©ã€ãã©ãªã®å¥¥æ·±ãã«é ãããŠããããŠãŒã¶ãŒã©ã³ã ã³ãŒãããã®ãšã³ã³ãŒã ããã»ã¹ã«åœ±é¿ãäžããããšã¯ã§ããŸããã ãäžæ¹ãçŽç²ãª PHP ã³ãã¯ã¿ã¯ãæšæºãšã³ã³ãŒããæ¡åŒµããããç¬èªã®å®è£ ã䜿çšããããšã«ãã£ãŠããšã³ã³ãŒã ããã»ã¹ãã«ã¹ã¿ãã€ãºããæ©èœãæäŸããŸããããã«äœ¿çšã§ãããšã³ã³ãŒãã¯2ã€ããã1ã€ã¯ ïŒå ¬åŒMessagePack PECLæ¡åŒµïŒãããäžã€ã¯ (çŽç²ãª PHP ã§)ã
ã³ãã¯ã¿ãæ¯èŒããåã«ãPHP ã³ãã¯ã¿ã® MessagePack ãšã³ã³ãŒãã®ããã©ãŒãã³ã¹ã枬å®ãããããªããã¹ãã§æé«ã®çµæã瀺ããã®ã䜿çšããŸãããã

PHP ããŒãžã§ã³ (Pure) ã¯é床ã®ç¹ã§ã¯ PECL æ¡åŒµæ©èœããå£ããŸãããå®éã®ãããžã§ã¯ãã§ã¯ãã¯ã䜿çšããããšããå§ãããŸãã å
¬åŒã®MessagePackæ¡åŒµæ©èœã§ã¯ããã©ãŒããã仿§ãéšåçã«ããå®è£
ãããŠããªãããïŒäŸãã°ãã«ã¹ã¿ã ããŒã¿åã¯ãµããŒããããŠããããããããªããšTarantool 2.3ã§å°å
¥ãããæ°ããããŒã¿åã§ããDecimalã䜿çšã§ããŸããïŒãä»ã®å€ãã® (PHP 7.4 ãšã®äºææ§ã®åé¡ãå«ã)ããŸããå
šäœçã«èŠããšããã®ãããžã§ã¯ãã¯æŸæ£ãããããã«èŠããŸãã
ããã§ã¯ãåæã¢ãŒãã§ã³ãã¯ã¿ã®ããã©ãŒãã³ã¹ã枬å®ããŠã¿ãŸãããã

ã°ã©ããããããããã«ãPECL ã³ãã¯ã¿ (Tarantool) ã¯ãPHP ã³ãã¯ã¿ (ã¯ã©ã€ã¢ã³ã) ãšæ¯èŒããŠåªããããã©ãŒãã³ã¹ã瀺ããŠããŸããããããåŸè
ã¯ãããé
ãèšèªã§å®è£
ãããŠããããšã«å ããŠãæ¬è³ªçã«ã¯ããå€ãã®äœæ¥ïŒåŒã³åºãããšã«æ°ãããªããžã§ã¯ããäœæãããïŒãè¡ãããšãèãããšãããã¯é©ãã¹ãããšã§ã¯ãããŸããã ãªã¯ãšã¹ã О äžçã®åã ïŒã»ã¬ã¯ãã®å Žåã åºæºãUpdate/Upsertã®å Žå â æ¥åå·è¡çµ±æ¬ïŒãå¥åã®ãšã³ãã£ã㣠æ¥ç¶, ããã«ãŒ О ãã³ãã© ãªãŒããŒãããã远å ãããŸããåœç¶ã§ãããæè»æ§ã«ã¯ä»£åã䌎ããŸãããã ããå
šäœçã«ã¯ãPHP ã€ã³ã¿ãŒããªã¿ãŒã¯è¯å¥œãªããã©ãŒãã³ã¹ã瀺ããŠããŸããéãã¯ãããã®ã®ãããã¯éèŠã§ã¯ãªããPHP 7.4 ã®ããªããŒãã䜿çšãããšããã«å°ãããªãå¯èœæ§ããããPHP 8 ã® JIT ã¯èšããŸã§ããããŸããã
次ã«é²ã¿ãŸãããã Tarantool 2.0 㯠SQL ããµããŒãããããã«ãªããŸããã SQL ãããã³ã«ã䜿çšããŠãSelectãInsertãUpdateãDelete æäœãå®è¡ãããã®çµæã noSQL (ãã€ããª) ã®åçã®çµæãšæ¯èŒããŠã¿ãŸãããã

SQL ã®çµæã¯ããŸãå°è±¡çã§ã¯ãããŸãã (åæã¢ãŒãã¯ãŸã ãã¹ãäžã§ããããšã«æ³šæããŠãã ãã)ãããããç§ã¯ããã«ã€ããŠäºåã«æãã€ããã¯ãããŸãããSQLãµããŒãã¯ãŸã 掻çºã«éçºäžã§ãïŒæ¯èŒçæè¿ãäŸãã°ããµããŒãã远å ãããŸããïŒã ïŒãããŠããªã¹ããã倿ãããš ä»åŸãSQL ãšã³ãžã³ã§ã¯ããŸããŸãªæé©åãè¡ãããäºå®ã§ãã
éåæ
ããŠãAsync æ¡åŒµæ©èœãäžèšã®çµæãæ¹åããã®ã«ã©ã®ããã«åœ¹ç«ã€ããèŠãŠã¿ãŸããããéåæããã°ã©ã ãäœæããããã«ãæ¡åŒµæ©èœã¯ã³ã«ãŒãã³ã«åºã¥ã API ãæäŸããŠãããããã䜿çšããŸããçµéšçã«ãç§ãã¡ã®ç°å¢ã«æé©ãªã³ã«ãŒãã³ã®æ°ã¯ 25 ã§ããããšãããããŸããã

10,000 åã®æŒç®ã 25 åã®ã³ã«ãŒãã³ã«åæ£ãããŠã次ã®çµæãèŠãŠã¿ãŸãããã

3ç§ãããã®æäœæ°ã¯XNUMXå以äžã«å¢å ããŸããã !
æ®å¿µãªããšã«ãPECL ã³ãã¯ã¿ã¯ ext-async ã§èµ·åã§ããŸããã§ããã
SQLã«ã€ããŠã¯ã©ãã§ãã?

ã芧ã®ãšãããéåæã¢ãŒãã§ã¯ãã€ã㪠ãããã³ã«ãš SQL ã®å·®ã¯èª€å·®ç¯å²å
ã«ãªããŸããã
ã¹ãŠãŒã«
ä»åºŠã¯ Swoole ã®å Žåã«ãã³ã«ãŒãã³ã®æé©ãªæ°ãããäžåºŠèª¿ã¹ãŠã¿ãŸãããã

25 ã§æ¢ããŸããããAsync æ¡åŒµæ©èœãšåãããªãã¯ãç¹°ãè¿ããŠã10,000 ã®æäœã 25 åã®ã³ã«ãŒãã³ã«åæ£ããŸããããããã«ããã¹ãŠã®äœæ¥ã 2 ã€ã®ããã»ã¹ã«åå²ããå¥ã®ãã¹ãã远å ããŸã (ã€ãŸããåããã»ã¹ã¯ 5,000 ã®ã³ã«ãŒãã³ã§ 25 ã®æäœãå®è¡ããŸã)ãããã»ã¹ã¯ä»¥äžã䜿çšããŠäœæãããŸã ã¹ãŠãŒã«ããã»ã¹.
çµæïŒ

Swole ã¯ã2 ã€ã®ããã»ã¹ã§å®è¡ããå ŽåãAsync ãšæ¯èŒããŠãããã«äœãçµæã瀺ããŸããã2 ã€ã®ããã»ã¹ã§ã¯ç¶æ³ã¯åçã«å€åããŸã (2 ãšããæ°åã¯å¶ç¶ã«éžæãããããã§ã¯ãªããç§ã®ãã·ã³ã§ã¯ XNUMX ã€ã®ããã»ã¹ãæè¯ã®çµæã瀺ããŸãã)ã
ã¡ãªã¿ã«ãAsync æ¡åŒµæ©èœã«ã¯ããã»ã¹ãæäœããããã® API ããããŸããããã³ãããŒã¯ã 1 ã€ã®ããã»ã¹ã§å®è¡ããå Žåãšè€æ°ã®ããã»ã¹ã§å®è¡ããå Žåã®éãã¯ããããŸããã§ãã (ã©ããã§å€±æããå¯èœæ§ããããŸã)ã
SQL ãšãã€ã㪠ãããã³ã«:

Async ã®å Žåãšåæ§ã«ãéåæã¢ãŒãã§ã¯ãã€ããªæäœãš SQL æäœã®éãã¯ãªããªããŸãã
䞊åã·ãã¥ã¬ãŒã·ã§ã³ã®èšå®
Parallel æ¡åŒµæ©èœã¯ã³ã«ãŒãã³ã§ã¯ãªãã¹ã¬ããã«é¢ãããã®ãªã®ã§ã䞊åã¹ã¬ããã®æé©ãªæ°ã枬å®ããŠã¿ãŸãããã

ç§ã®ãã·ã³ã§ã¯ 16 ã§ãã 16 åã®äžŠåã¹ã¬ããã§ã³ãã¯ã¿ ãã³ãããŒã¯ãå®è¡ããŠã¿ãŸãããã

ã芧ã®ãšãããçµæã¯éåææ¡åŒµæ©èœ (2 ã€ã®ããã»ã¹ã§å®è¡ãããŠãã Swoole ãé€ã) ãããããã«åªããŠããŸãã PECL ã³ãã¯ã¿ã®å ŽåãUpdate æäœãš Upsert æäœã¯ç©ºã§ããããšã«æ³šæããŠãã ãããããã¯ããããã®æäœããšã©ãŒã§ã¯ã©ãã·ã¥ããããã§ããåå ã ext-parallelãext-tarantoolããŸãã¯ãã®äž¡æ¹ã§ãããã©ããã¯ããããŸããã
次ã«ãSQL ããã©ãŒãã³ã¹ãæ¯èŒããŠã¿ãŸãããã

åæçã«èµ·åãããã³ãã¯ã¿ã®ã°ã©ããšã®é¡äŒŒæ§ã«æ°ã¥ããŸããã?
ã¿ããªã§
æåŸã«ããã¹ãããæ¡åŒµæ©èœã®å šäœåã確èªããããã«ããã¹ãŠã®çµæã 1 ã€ã®ã°ã©ãã«ãŸãšããŠã¿ãŸãããããŸã å®è¡ããŠããªãæ°ãããã¹ãã 1 ã€ã ãã°ã©ãã«è¿œå ããŸããããParallel* ã䜿çšããŠãéåæã³ã«ãŒãã³ã䞊åã«å®è¡ããŠã¿ãŸããããäžèšã®æ¡åŒµæ©èœãçµ±åãããšããã¢ã€ãã¢ã¯ãã§ã« èè ãã¯åæã«éããªãã£ããããç§ãã¡èªèº«ã§ãããè¡ããªããã°ãªããŸããã
* Parallel ã§ Swoole ã³ã«ãŒãã³ãå®è¡ã§ããŸããã§ããããããã®æ¡åŒµæ©èœã¯äºææ§ããªãããã§ãã
æçµçµæã¯ä»¥äžã®ãšããã§ãã

代ããã«ãçµè«ã®
ç§ã®æèŠã§ã¯ãçµæã¯ããªãè¯å¥œã§ãäœããã®çç±ã§ãããéçã§ã¯ãªããšç¢ºä¿¡ããŠããŸããå®éã®ãããžã§ã¯ãã§ãããå¿
èŠãã©ããã¯å®å
šã«ããªã次第ã§ãããç§ã«ãšã£ãŠã¯è峿·±ãå®éšã§ãããæå°éã®åŽåã§åæ TCP ã³ãã¯ã¿ããã©ãã ãã®ãã®ããçµãåºããããšãã§ããããè©äŸ¡ã§ãããšã ãèšã£ãŠãããŸãããã³ãããŒã¯ãæ¹åããæ¹æ³ã«ã€ããŠäœãã¢ã€ãã¢ãããã°ããã« ãªã¯ãšã¹ããæ€èšãããŠããã ããŸããå®è¡æé ãšçµæãå«ãã³ãŒãå
šäœã¯å¥ã® .
åºæïŒ habr.com
