Plumber: ๊ธด ์š”์ฒญ์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ

์— ๋งŒ๋“  2016๋…„ 08์›” 25์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rstudio/plumber

์•ˆ๋…• !

์•ฝ 3๋ถ„์ด ์†Œ์š”๋˜๋Š” ๊ธด ๋ณด๊ณ ์„œ๋ฅผ PDF๋กœ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐฐ๊ด€๊ณต์„ ํ†ตํ•ด ์ด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
HTTP ์—ฐ๊ฒฐ์€ ์•ฝ 1๋ถ„ 40์ดˆ(100์ดˆ)์— ๋‹ซํž™๋‹ˆ๋‹ค.

๋ฐฐ๊ด€๊ณต์ด ๋‹ซํžŒ ์—ฐ๊ฒฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
ERROR: [on_request_read] connection reset by peer

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด # 12์™€ ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ https://github.com/rstudio/httpuv/issues/49

๋ฐฐ๊ด€๊ณต์—์„œ ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? Plumber์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜๋™์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Keep-Alive: timeout=300
Connection: Keep-Alive

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” # 12๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š”,
์ž„๋งˆ๋ˆ„์—˜

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ: fork ing์€ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ parallel ํŒจํ‚ค์ง€๋กœ ์‰ฝ๊ฒŒ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}

๋ชจ๋“  3 ๋Œ“๊ธ€

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” httpuv์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์ด๊ฒƒ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ง€๋Šฅ์ ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฑธ์Œ ๋ฌผ๋Ÿฌ์„œ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ์ฆ‰์‹œ ์‘๋‹ตํ•œ ๋‹ค์Œ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์›๋ž˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ผ๋ถ€ ID๋ฅผ ์–ป์€ ๋‹ค์Œ ์™„๋ฃŒ๋  ๋•Œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํด๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ R์€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ ์ด๊ฒƒ์€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด R ํ”„๋กœ์„ธ์Šค์—์„œ fork ๋ฅผ ์‚ดํŽด๋ณธ ๋‹ค์Œ(๋ณ‘๋ ฌ ๋˜๋Š” ๋‹ค์ค‘ ์ฝ”์–ด ํŒจํ‚ค์ง€ ์ฐธ์กฐ) ํ”„๋กœ์„ธ์Šค์˜ ํฌํฌ์—์„œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ API ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: ๋ณด๊ณ ์„œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํด๋งํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ).

์•ˆ๋…•,

์—ฌ๊ธฐ์—์„œ R ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์œผ๋ฉด ๋Œ์•„์™€์„œ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ: fork ing์€ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ parallel ํŒจํ‚ค์ง€๋กœ ์‰ฝ๊ฒŒ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰