Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”

PHP ์ƒํƒœ๊ณ„์—๋Š” ํ˜„์žฌ Tarantool ์„œ๋ฒ„์™€ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ์ปค๋„ฅํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต์‹ PECL ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํƒ€๋ž€ํˆด/tarantool-php, C๋กœ ์ž‘์„ฑ, tarantool-php/ํด๋ผ์ด์–ธํŠธ, PHP๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ›„์ž์˜ ์ €์ž์ด๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ 3-5 ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ์—!).

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ธ๊ฐ€?

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๋“ค์„ ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ ๋น„๋™๊ธฐ์‹, ๋ณ‘๋ ฌ ๋ฐ ๋น„๋™๊ธฐ์‹ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ์ปค๋„ฅํ„ฐ์ž…๋‹ˆ๋‹ค. ๐Ÿ™‚ ๋˜ํ•œ ์ปค๋„ฅํ„ฐ ์ž์ฒด์˜ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ™•์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์Šค์šธ โ€• PHP์šฉ ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Alibaba ๋ฐ Baidu์™€ ๊ฐ™์€ ๊ฑฐ๋Œ€ ์ธํ„ฐ๋„ท ๊ธฐ์—…์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ 4.1.0๋ถ€ํ„ฐ ๋งค์ง ๋ฉ”์†Œ๋“œ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. SwooleRuntime::enableCoroutine(), ์ด๋ฅผ ํ†ตํ•ด "ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ ๋™๊ธฐ์‹ PHP ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋ณ€ํ™˜"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Async๋Š” ์ตœ๊ทผ๊นŒ์ง€ PHP์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์œ„ํ•œ ๋งค์šฐ ์œ ๋งํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ๊นŒ์ง€ ์™œ? ์•ˆํƒ€๊น๊ฒŒ๋„ ์ œ๊ฐ€ ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์ž‘์„ฑ์ž๊ฐ€ ์ €์žฅ์†Œ๋ฅผ ์‚ญ์ œํ–ˆ์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ํ–ฅํ›„ ์šด๋ช…์€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ผญ ์จ๋ด์•ผ๊ฒ ์–ด์š” ํ•œ ํฌํฌ์—์„œ. Swoole๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด TCP ๋ฐ TLS ์ŠคํŠธ๋ฆผ์˜ ํ‘œ์ค€ ๊ตฌํ˜„์„ ๋น„๋™๊ธฐ ๋ฒ„์ „์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์†๋ชฉ์„ ๊ฐ€๋ณ๊ฒŒ ์›€์ง์—ฌ ๋ฐ”์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” '์˜ต์…˜์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.๋น„๋™๊ธฐ.tcp = 1".
  • ํ‰ํ–‰ โ€• phpdbg, apcu, pthreads, pcov, uopz์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ €์ž์ด์ž ์ž˜ ์•Œ๋ ค์ง„ Joe Watkins์˜ ์ƒ๋‹นํžˆ ์ƒˆ๋กœ์šด ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ์ด ํ™•์žฅ์€ PHP์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ pthread๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘์š”ํ•œ ์ œํ•œ์€ PHP์˜ ZTS(Zend Thread Safe) ๋ฒ„์ „์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ• ๊นŒ์š”?

๋ฏธ๋ฆฌ ์“ฐ๊ธฐ ๋กœ๊น…์ด ๋น„ํ™œ์„ฑํ™”๋œ Tarantool ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(wal_mode = ์—†์Œ) ๋ฐ ์ฆ๊ฐ€๋œ ๋„คํŠธ์›Œํฌ ๋ฒ„ํผ(๋ฏธ๋ฆฌ ์ฝ๊ธฐ = 1 * 1024 * 1024). ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์€ ๋””์Šคํฌ ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์€ ์šด์˜ ์ฒด์ œ ๋ฒ„ํผ์—์„œ ๋” ๋งŽ์€ ์š”์ฒญ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ(์‚ฝ์ž…, ์‚ญ์ œ, ์ฝ๊ธฐ ๋“ฑ)๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฒค์น˜๋งˆํฌ์˜ ๊ฒฝ์šฐ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— 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
๋„์ปค: 19.03.3, a872fc2f86 ๋นŒ๋“œ
PHP: 7.3.11 (cli) (๋นŒ๋“œ ๋‚ ์งœ: 22๋…„ 2019์›” 08์ผ 11:04:XNUMX)
ํƒ€๋ž€ํˆด/ํด๋ผ์ด์–ธํŠธ: 0.6.0
๋ฆฌ๋ฐ”ํ‚ท/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 ์ปค๋„ฅํ„ฐ๋Š” ํ‘œ์ค€ ์ธ์ฝ”๋”๋ฅผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ž์ฒด ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ์ธ์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. msgpack/msgpack-php (๊ณต์‹ MessagePack PECL ํ™•์žฅ), ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฐ”ํ‚ท/msgpack (์ˆœ์ˆ˜ํ•œ PHP์—์„œ).

์ปค๋„ฅํ„ฐ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์ „์— PHP ์ปค๋„ฅํ„ฐ์— ๋Œ€ํ•œ MessagePack ์ธ์ฝ”๋”์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ธ์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
PHP ๋ฒ„์ „(Pure)์€ PECL ํ™•์žฅ๋ณด๋‹ค ์†๋„๊ฐ€ ๋–จ์–ด์ง€์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฐ”ํ‚ท/msgpack, ๊ณต์‹ MessagePack ํ™•์žฅ์—์„œ๋Š” ํ˜•์‹ ์‚ฌ์–‘์ด ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ๊ตฌํ˜„๋˜๊ณ (์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์›์ด ์—†์œผ๋ฏ€๋กœ Tarantool 2.3์— ๋„์ž…๋œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์œ ํ˜•์ธ Decimal์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค) ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ˆ˜ ะฟั€ะพะฑะปะตะผ (PHP 7.4์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ํฌํ•จ) ๊ธ€์Ž„, ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋Š” ํฌ๊ธฐ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋™๊ธฐ ๋ชจ๋“œ์—์„œ ์ปค๋„ฅํ„ฐ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๊ทธ๋ž˜ํ”„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด PECL ์ปค๋„ฅํ„ฐ(Tarantool)๋Š” PHP ์ปค๋„ฅํ„ฐ(ํด๋ผ์ด์–ธํŠธ)์— ๋น„ํ•ด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ›„์ž๊ฐ€ ๋Š๋ฆฐ ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์‹ค์ œ๋กœ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด๋Š” ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜๋ขฐ ะธ ์‘๋‹ต (Select์˜ ๊ฒฝ์šฐ - ๋˜ํ•œ ๊ธฐ์ค€, ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ/์—…์„œํŠธ์˜ ๊ฒฝ์šฐ โ€• ํ–‰์ •๋ถ€), ๊ฐœ๋ณ„ ์—”ํ„ฐํ‹ฐ ์—ฐ๊ฒฐ, ํฌ์žฅ ๊ธฐ๊ณ„ ะธ ์ฒ˜๋ฆฌ๊ธฐ ๊ทธ๋“ค์€ ๋˜ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์œ ์—ฐ์„ฑ์—๋Š” ๋Œ€๊ฐ€๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ PHP ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ ์ฐจ์ด๋Š” ์žˆ์ง€๋งŒ ๋ฏธ๋ฏธํ•˜๋ฉฐ PHP 7.4์˜ JIT๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ  PHP 8์—์„œ ์‚ฌ์ „ ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋‚ฎ์•„์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์† ์ง„ํ–‰ํ•ฉ์‹œ๋‹ค. Tarantool 2.0์—์„œ๋Š” SQL ์ง€์›์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SQL ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ, ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ noSQL(๋ฐ”์ด๋„ˆ๋ฆฌ)๊ณผ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
SQL ๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆฌ ์ธ์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์•„์ง ๋™๊ธฐ ๋ชจ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Œ์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋ฆฌ ์ด์— ๋Œ€ํ•ด ํ™”๋ฅผ ๋‚ด์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. SQL ์ง€์›์€ ์•„์ง ํ™œ๋ฐœํ•˜๊ฒŒ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค(๋น„๊ต์  ์ตœ๊ทผ์—๋Š” ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ์ค€๋น„๋œ ์ง„์ˆ ) ๊ทธ๋ฆฌ๊ณ  ๋ชฉ๋ก์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ๋ฌธ์ œ, SQL ์—”์ง„์€ ํ–ฅํ›„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ตœ์ ํ™”๋ฅผ ๊ฑฐ์น  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ

์ž, ์ด์ œ Async ํ™•์žฅ์ด ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ฝ”๋ฃจํ‹ด ๊ธฐ๋ฐ˜ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ตœ์ ์˜ ์ฝ”๋ฃจํ‹ด ์ˆ˜๋Š” 25๊ฐœ๋ผ๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜์ ์œผ๋กœ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
10,000๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด์— 25๊ฐœ์˜ ์ž‘์—…์„ "๋ถ„์‚ฐ"ํ•˜๊ณ  ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
์ดˆ๋‹น ์ž‘์—… ํšŸ์ˆ˜๊ฐ€ 3๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. tarantool-php/ํด๋ผ์ด์–ธํŠธ!

์•ˆํƒ€๊น๊ฒŒ๋„ PECL ์ปค๋„ฅํ„ฐ๋Š” ext-async๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

SQL์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๋ณด์‹œ๋‹ค์‹œํ”ผ ๋น„๋™๊ธฐ ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ๊ณผ SQL์˜ ์ฐจ์ด๊ฐ€ ์˜ค๋ฅ˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์Šค์šธ

์ด๋ฒˆ์—๋„ Swoole์— ๋Œ€ํ•œ ์ตœ์ ์˜ ์ฝ”๋ฃจํ‹ด ์ˆ˜๋ฅผ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.
Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
25์—์„œ ๋ฉˆ์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค. Async ํ™•์žฅ๊ณผ ๋™์ผํ•œ ํŠธ๋ฆญ์„ ๋ฐ˜๋ณตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 10,000๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด ๊ฐ„์— 25๊ฐœ์˜ ์ž‘์—…์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์ž‘์—…์„ 2๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋ˆ„๋Š” ๋˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” 5,000๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด์—์„œ 25๊ฐœ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค). ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์Šค์šธํ”„๋กœ์„ธ์Šค.

๊ฒฐ๊ณผ :

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
Swole์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋  ๋•Œ Async์— ๋น„ํ•ด ์•ฝ๊ฐ„ ๋‚ฎ์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ, 2๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฆผ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค(์ˆซ์ž 2๋Š” ์šฐ์—ฐํžˆ ์„ ํƒ๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ ์ปดํ“จํ„ฐ์—์„œ๋Š” 2๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค).

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , Async ํ™•์žฅ์—๋Š” ํ”„๋กœ์„ธ์Šค ์ž‘์—…์„ ์œ„ํ•œ API๋„ ์žˆ์ง€๋งŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์–ด๋–ค ์ฐจ์ด๋„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค(์–ด๋”˜๊ฐ€์—์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

SQL ๋Œ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ:

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๋น„๋™๊ธฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋™๊ธฐ ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž‘์—…๊ณผ SQL ์ž‘์—… ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

ํ‰ํ–‰

๋ณ‘๋ ฌ ํ™•์žฅ์€ ์ฝ”๋ฃจํ‹ด์ด ์•„๋‹ˆ๋ผ ์Šค๋ ˆ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ตœ์ ์˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์ธก์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” 16๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 16๊ฐœ์˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ์—์„œ ์ปค๋„ฅํ„ฐ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ฒฐ๊ณผ๋Š” ๋น„๋™๊ธฐ์‹ ํ™•์žฅ๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค(2๊ฐœ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๋Š” Swoole์€ ์ œ์™ธ). PECL ์ปค๋„ฅํ„ฐ์˜ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ ๋ฐ Upsert ์ž‘์—…์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹คํŒจํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ext-parallel, ext-tarantool ๋˜๋Š” ๋‘˜ ๋‹ค์˜ ์ž˜๋ชป์ธ์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ SQL ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”
๋™๊ธฐ์‹์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ปค๋„ฅํ„ฐ์˜ ๊ทธ๋ž˜ํ”„์™€ ์œ ์‚ฌ์ ์„ ํ™•์ธํ•˜์‹ญ๋‹ˆ๊นŒ?

ํ•จ๊ป˜

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๋กœ ์š”์•ฝํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๋ฅผ ์ฐจํŠธ์— ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Parallel*์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋ฃจํ‹ด์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๋ ค๋Š” ์•„์ด๋””์–ด๋Š” ์ด๋ฏธ ๋…ผ์˜ ๋œ ์ €์ž๊ฐ€ ์žˆ์ง€๋งŒ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์œผ๋ฏ€๋กœ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

* Swoole ์ฝ”๋ฃจํ‹ด์„ Parallel๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Async, Swoole ๋ฐ Parallel์„ ์‚ฌ์šฉํ•˜์—ฌ Tarantool์šฉ PHP ์ปค๋„ฅํ„ฐ ๊ฐ€์†ํ™”

๋Œ€์‹  ๊ฒฐ๋ก 

์ œ ์ƒ๊ฐ์—๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๋‹นํžˆ ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉฐ ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ์ด๊ฒƒ์ด ํ•œ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค! ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ๋™๊ธฐ์‹ TCP ์ปค๋„ฅํ„ฐ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์„ "์••์ฐฉ"ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์‹คํ—˜์ด์—ˆ๋‹ค๊ณ ๋งŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ๊ฐœ์„ ์„ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ์‹œ๋ฉด ๊ท€ํ•˜์˜ ํ’€ ์š”์ฒญ์„ ๊ธฐ๊บผ์ด ๊ณ ๋ คํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ง€์นจ ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€