bumblebee
๋ ์ฟ ๋ฎค์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์
์ ๋ด๋นํ๋ ๋ง์ดํฌ๋ก์๋น์ค์ด๋ค. Go์ Worker pool pattern์ด๋ pipeline pattern, Fan-in Fan-out pattern๊ณผ ๊ฐ์ ์ฌ๋ฌ Concurrency pattern(๋์์ฑ ํจํด)๋ค์ ์ ์ฉ์์ผ๋ณด๊ณ ์ํ์ผ๋ฉฐ ๊ธฐ์กด์ ๋จ์ํ ํจ์ ํธ์ถ ํํ์๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค.
Go ์ธ์ด์ ํฐ ํน์ง ์ค ํ๋๋ ๋ค์ํ Concurrency pattern์ ์ด์ฉํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ด๋ค. ๋ช ๊ฐ์ง Concurrency pattern์ ๋ค์๊ณผ ๊ฐ๋ค.
Worker pool
pattern - ์์ฒญ์ด ์์ ๋๋ง๋ค Worker(Goroutine)์ด ์๊ฒจ๋๋ฉฐ ๊ทธ ๊ฐ์์ ์ ํ์ด ์๋ ๊ฒ์ด ์๋๋ผ ์ผ์ ํ pool size๋งํผ๋ง goroutine์ ์์ฑํ๊ณ , ์์ฒญ๋ง channel์ ํตํด ๋ถ๋ถ ๋ถ๋ถ ์ ๋ฌํด์ฃผ๋ ํจํดPipeline
pattern - A ๋จ๊ณ์์ ์์ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ์๋ฃํ ๋ค์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํต์งธ๋ก ๋ฆฌํดํ๊ณ , ๊ทธ๊ฒ์ ๋ค์ ๋จ๊ณ์ธ B ๋จ๊ณ๊ฐ ์ ๋ ฅ์ผ๋ก์ ์ด์ฉํ๋ ๊ฒ์ด ์๋๋ผ A ๋จ๊ณ์์๋ ์ค์๊ฐ์ผ๋ก ์์ ์ฒ๋ฆฌ๋ฅผ ์ ๋ฌํchannel
์ ๋ฆฌํดํ๊ณ B ๋จ๊ณ๋ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์๋ channel์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ํจํด. channel์ ์ด์ฉํด A์ B ๋จ๊ณ ์ฌ์ด์ pipline์ด ์์ฑ๋๋ค๊ณ ๋ณผ ์ ์๋ค.Fan-in Fan-out
pattern - Fan-in์ด๋ ์ฌ๋ฌ Worker(goroutine)๋ก๋ถํฐ 1๊ฐ์ channel์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ๊ฒ์ ๋งํ๊ณ , Fan-out์ ์ฌ๋ฌ Worker(goroutine)์ผ๋ก๋ถํฐ 1๊ฐ์ channel์ ๋ฐ์ดํฐ๊ฐ ๋น ์ ธ๋๊ฐ๋ ๊ฒ์ ๋งํ๋ค. ์ฃผ๋ก ์ด๋ค worker๊ฐ 1๊ฐ์ channel ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๊ฒ ๋ ์ง๋ idleํ worker ์ค randomํ๊ฒ ์ ํด์ง๋ค๊ณ ๋ณผ ์ ์๋ค.
Fan-in Fan-out pattern ์์ pipeline pattern์ด ์ํ ์๋ ์๋ ๋ฑ ๊ฐ๊ฐ์ pattern์ ์๋ก ์์ ํ ๋ ๋ฆฝ๋ ๋ณ๊ฐ์ ํจํด์ด ์๋ ๋ฏ ํ๋ค.
bumblebee๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ Fan-in Fan-out pattern์ ์ฌ์ฉํ๊ณ ์๊ณ , ์ฌ์ค์ Fan-in Fan-out์ ์ํด์ ๊ฐ step๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํ pipeline pattern, N๊ฐ์ worker๋ค์ด ํ channel์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํ worker pool pattern ๋ฑ์ด ์ ์ฉ๋์ด์ผํ๋ค.
- ๊ฐ๋จํ ๋งํ์๋ฉด Fan-in Fan-out pattern์ ์ฌ์ฉ ์ค.
- ์ฌ์ฉ์์ ์์ฒญ์ ์๋ตํ๋ HttpHandling gorutine๋ค(๊ฐ์๊ฐ ์ ํด์ง์ง ์์)์ด 1๊ฐ์ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ์์ channel์ ๋ฉ์์ง๋ฅผ ์ ๋ฌ
- ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ์์ปค๋ค์ธ M๊ฐ์ goroutine๋ค์ด ํด๋น channel์์ ๋ฉ์์ง๋ฅผ ๊บผ๋ด์ด ๋ฆฌ์ฌ์ด์ง ์์
- ๋ฆฌ์ฌ์ด์ง ์์ ์ด ์๋ฃ๋๋ฉด ์ ๋ก๋ ์์ channel์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
- ์ ๋ก๋ ์์ปค์ธ L๊ฐ์ goroutine๋ค์ด ํด๋น channel์์ ๋ฉ์์ง๋ฅผ ๊บผ๋ด์ด ์ค์ ์ ๋ก๋ ์์ ์ ํ๋ goroutine์ ์คํ์ํจ๋ค.
์ด๋ ๊ฒ concurrency pattern์ ์ด์ฉํ ๋์ ์ฅ์ ์ ๋ํด ์์๋ณด์.
์ฅ์ 1. ์ ์ฒด ์์ ์ด ๋์ด์ง์ง ์๊ณ , ์์ ์์ ์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์๋ค.
CPU Boundํ ์์ ์ ๋์์ ์ผ๋ก ์ํํ๋ ค๋ ๊ฒฝ์ฐ CPU์ ํ๊ณ ์ ์์ ๋ค์ด ๊ณจ๊ณ ๋ฃจ ์ํ๋์ด์ผํ๋ฏ๋ก thread๋ goroutine์ด ๋ง์ ์๋ก ์ ์ฒด ์์ ๋ค์ด ๋์ด์ง๋ค. ์๋ฅผ ๋ค์ด 30๊ฐ์ ์์ฒญ์ด ๋น์ทํ ์๊ธฐ์ ๋ค์ด์จ๋ค๋ฉด 30๊ฐ์ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง goroutine์ด ์์ฑ๋๊ณ , 30๊ฐ๊ฐ ๊ณจ๊ณ ๋ฃจ ๋ชจ๋ ์์ ์ด ๋๋ ๋์ฏค ์ฐ๋ฃจ๋ฃจ ์์ ์ด ์๋ฃ๋๋ค.
๋ฐ๋ฉด ์ํ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ์์ ์ ์๋ฅผ ๋ค์ด 6๊ฐ์ goroutine์ด ๋ด๋นํ๋๋ก Worker pool์ ์ด์ฉํ๋ค๋ฉด 30๊ฐ์ ์์ฒญ์ด ์๋ค๊ณ ํด์ 30๊ฐ์ ๊ณ ๋ฃจํด์ด ์์ฑ๋ ๋ค ์ ์ฒด 30๊ฐ์ ์์ ์ด ๋์ด์ง๋ ๊ฒ์ด ์๋๋ผ 6๊ฐ ์์ ๋จ์๋ก ๋ฐ๋ก ๋ฐ๋ก ์ฒ๋ฆฌ๋๋ค๊ณ ๋ณผ ์ ์๋ค. Throughput๋ฉด์์๋ ๋ณ ์ฐจ์ด๊ฐ ์์ง๋ง ๊ฐ๋ณ ์์ ๋ฉด์์๋ latency๊ฐ ํฌ๊ฒ ๊ฐ์ํ๊ณ , Memory ํจ์จ๋ฉด์์๋ ์ ์ฒด ์์ ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ ์ ํ ํ์ ์์ด ์๋ฃ๋ ์์ ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋จผ์ ํด์ ๋ ์ ์์ผ๋ ์ฐ์ํ๋ค.
์ฅ์ 2. ๋ฉ์์ง ๋ธ๋ก์ปค ์๋น์ค ์ด์ฉ ์์ด ๋ฉ์์ง ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ค.
Image ์๋ฒ ํ๋๋ฅผ ํ๋ฉด์ App๋ด์ ๋ฉ์์ง ์ ๋ฌ์ ์ํด Kafka๋ RabbitMQ์ ๊ฐ์ ์๋น์ค๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ํจ์จ์ ์ด์ง๋ ์๊ณ ์ฑ๊ฐ์ค ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฉ์์ผ๋ก๋ Resize ํจ์ ํธ์ถ ํ Upload ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋จํ๊ธดํ๋ค. ํ์ง๋ง ์ด๋๊ฐ Resize ํธ์ถ => Upload ํธ์ถ์ ๊ด๋ฆฌํ๋ ๋ก์ง๋ ํ์ํ ๊ฒ์ด๊ณ ๊ทธ๊ณณ์์ Resize๋ Upload์ ๋ํ ์๋ฌ ์ฒ๋ฆฌ๋ ๋ด๋น์ ํด์ผํ ๊ฒ์ด๋ค. Resize ํจ์ ๋ด์ Upload ํจ์๋ฅผ ํฌํจ์ํจ๋ค๋ฉด Resize ํจ์ ๋ด์์ Upload์ ๋ํ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํด์ผํ ์๋ ์๋ค.
ํ์ง๋ง pipeline ํน์ fan-in fan-out ํจํด์ ์ด์ฉํ๋ฉด ๋ฉ์์ง ์์คํ ์ ์ด์ฉํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์์ ์ ๋ฉ์์ง ์ ๋ฌ๋ง ์์ผ๋๊ณ ๊ทธ ๋ค๋ก ๊ทธ ๋ฉ์์ง๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง๋ ์ ํ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฌ ์ฒ๋ฆฌ๋ ์ดํ์ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์๊ฐ ์์์ํ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด Resize ํจ์๋ ๋ฆฌ์ฌ์ด์ง ์์ ์๋ฃ ํ Upload task๋ผ๋ ๋ฉ์์ง๋ง upload task channel์ ์ ์กํ๋ฉด ๋๊ณ Upload ๊ณผ์ ์์ ์ด๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ทธ๊ฒ์ Resize ํจ์์ ๊ด์ฌ ๋ฐ์ด๋ค. Upload๋ ๋๊ฐ ์๊ธฐ๋ฅผ ํธ์ถํ๋์ง ์ ํ์ ์์ด ๊ทธ๋ฅ upload task channel์์ ๋ฉ์์ง(task)๋ง ๊บผ๋ด์ด ์์ ํ๋ฉด ๋๋ค.
๋จ์ - ๋ฉ์์ง ๋ธ๋ก์ปค ์๋น์ค์ ๋ฌ๋ฆฌ ์ฑ์ด ์ฃฝ์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋์ ํตํด ์ ์ฅ ์ค์ด๋ ๋ฉ์์ง๊ฐ ์์ค๋๋ค.
๊ณผ์ฐ ์ ๋ง ๋ฆฌ์ฌ์ด์ง ์์ ์ Worker pool pattern์ ์ ์ฉํ ๋๊ฐ ์ ํ ์์ด goroutine์ ์์ฑํด์ ์ด์ฉํ ๋๋ณด๋ค ํจ์จ์ ์ผ๊น ๋ฒค์น๋งํฌ๋ฅผ ํตํด ์์๋ณด๊ณ ์ํ๋ค.
์ฌ์ฉ๋ Machine: AWS EC2 t2.micro
์์ : 2MB์ Image์ ๋ํ 128x128๋ก์ ๋ฆฌ์ฌ์ด์ง ์์ฒญ 30๊ฐ๋ฅผ ์ฒ๋ฆฌ.
goos: linux
goarch: amd64
pkg: github.com/khu-dev/bumblebee
BenchmarkTransformer_Start/30_task_worker_pool_1 5 426898179 ns/op
BenchmarkTransformer_Start/30_task_worker_pool_10 5 424531051 ns/op
BenchmarkTransformer_Start/30_task_worker_pool_19 5 423642287 ns/op
BenchmarkTransformer_Start/30_task_worker_pool_28 5 424124379 ns/op
BenchmarkTransformer_Start/30_task_unlimited_concurrency 5 425058364 ns/op
PASS
ok github.com/khu-dev/bumblebee 21.476s
์์ํ๋ ๋๋ก throughput์ ํฐ ์ฐจ์ด๊ฐ ์์๋ค. ํ์ง๋ง ๋จผ์ ๋ค์ด์จ ์์ ์ ๋จผ์ ์ฒ๋ฆฌ๋ ์ ์๋ค๋ ์ ์ด ์ฅ์ ์ผ ๊ฒ ๊ฐ๋ค.
์์ปค(goroutine)์ ์๋ฅผ N์ด๋ผ๊ณ ํ์ ๋
N = 1
: ๋จผ์ ๋ค์ด์จ ์์
์ด ๋ฌด์กฐ๊ฑด ๋จผ์ ์ฒ๋ฆฌ๋๋ค. ๋ง์ฝ ์์ ์์
์ด ์ค๋ ์๊ฐ์ ์๋ชจํ๋ค๋ฉด ๋ค์ ์์
๋ค๋ ๋ชจ๋ ์ง์ฐ๋๋ค.
N=๋ฌดํ๋
: ๋จผ์ ๋ค์ด์จ ์์
๊ณผ ๋์ค์ ๋ค์ด์จ ์์
์ด ๋ชจ๋ ๋์ด์ง๋ฉด์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌ๋๋ค.
๋ฐ๋ผ์ ๋จผ์ ๋ค์ด์จ ์์ ์ด ๋จผ์ ์ฒ๋ฆฌ๋ ์ ์์ผ๋ฉด์ ์ค๋ ์์ ์๊ฐ์ ์๋ชจํ๋ ์์ ์ด ์์ ์์นํด๋ ๋ค์ ์์ ๋ค์ด ์์ ํ ์ง์ฐ๋๊ธฐ๋ณด๋ค๋ ์ด๋ ์ ๋ ๋จผ์ ์ฒ๋ฆฌ๋ ์๋ ์๋๋ก ํ๊ธฐ ์ํด ์ ๋นํ 3๊ฐ~5๊ฐ ์ ๋์ goroutine์ ์ด์ฉํ๋ ๊ฒ์ด ์ด๋จ๊น์ถ๋ค.
์๋๋ ๋ ผ๋ฆฌ์ ํ๋ก์ธ์ ๊ฐ์๋ณด๋ค ์์ปค ์๊ฐ ์ ์ผ๋ฉด ์ฑ๋ฅ์ด ์์ฃผ ์์ข์์ง์ง๋ง, ๋ฆฌ์ฌ์ด์ง์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ ์์ฒด๊ฐ ํ๋์ ์์ ๋ ๋ ผ๋ฆฌ์ ํ๋ก์ธ์ ๋งํผ์ผ๋ก ์ชผ๊ฐ์ด ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ ์ํ goroutine์ด ๋ ผ๋ฆฌ์ ํ๋ก์ธ์ ๊ฐ์๋ณด๋ค ์ ๋๋ผ๋ ์๋๊ฐ ๋จ์ด์ง์ง ์๊ณ ์๋ค.
(2021.01.24) ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ฅผ ๊น๋ณด๋ ์ด๋ฏธ ๋ ผ๋ฆฌ์ ํ๋ก์ธ์ ๊ฐ์๋งํผ์ goroutine์ผ๋ก ์์ ํ๊ฒ ์ต์ ํ๊ฐ ๋์ด์์๊ณ , ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ์์ ์ด ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋์๋ค. ์ฐ๋ฆฌ ์ฟ ๋ฎค๊ฐ ์ ์ด์ ์ด๋ฏธ์ง ์ ๋ก๋ ์์ฒญ์ด ๋ง์ ์๋น์ค๋ ์๋์๋ ๊ธฐ์ ์ ์ผ๋ง์ผ๋ก ์ธํด ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ ์์ ์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌํด ๋์์ฑ ํจํด์ ์ ์ฉ์์ผ๋ณด์๋ค. ํ์ง๋ง ๋์์ฑ์ ์ด๋ ๊ฒ ์กฐ์ ํด๋ณผ๊น ์ ๋ ๊ฒ ์กฐ์ ํด๋ณผ๊น ํ๋ ๊ฒ์ ๋นํด ๊ฒฐ๊ณผ์๋ ํฐ ์ฐจ์ด๊ฐ ์์๋ ๊ฒ ๊ฐ์ ์กฐ๊ธ ์์ฝ๋ค.
๋น๊ทผ๋ง์ผ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ด๋ จ ๊ธ์ ๋ณด๋ฉด 2019.01 ๊ธฐ์ค ํ๋ฃจ 50๋ง์ฅ์ ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ์ด๋ค์ง๋ค๊ณ ํ๋ค. ๋น๊ทผ๋ง์ผ ์ด์ฉ์ ๋ณํ๋ฅผ ๋ณด๋ฉด ์ด๋ ๊ธฐ์ค์ผ๋ก ์ด์ฉ์๊ฐ ์ฝ 2021๋ ์ 4๋ฐฐ ์ฆ๊ฐํ์ ๊ฒ์ผ๋ก ์์๋๋ค. ๊ทธ๋ผ ์ฝ 200๋ง์ฅ์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋ ๋๋ค๊ณ ๊ฐ์ , ์๊ณ ์ผํ๋ ์๊ฐ ์ ์ธ ๊ทธ 200๋ง์ฅ์ ์ด๋ฏธ์ง๋ ํ๋ฃจ 24์๊ฐ์ด ์๋๋ผ ์ค์ง์ ์ผ๋ก 6์๊ฐ์ ๋ ๋์ ์ ๋ก๋ ๋๋ค๊ณ ๊ฐ์ ํ๋ฉด 1๋ถ๋น ์ฝ 5500์ฅ ์ ๋์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋ ๋๋ ์ ์ด๋ผ๊ณ ์ถ์ ํด๋ณผ ์ ์๊ฒ ๋ค. ์ด๋ฐ ๋๊ท๋ชจ ์๋น์ค์์๋ ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ ์๋ฒ์์ ์์ ์ Go์ ์ฑ๋๊ณผ ๊ณ ๋ฃจํด์ ์ด์ฉํ ๋์์ฑ ํจํด์ ์ ์ฉํด ์์ ํ์ฒ๋ผ ์ํํ๋ฉด ์ด๋์ ๋ ์ด์ ์ด ์์ ์ ์์ ๊ฒ ๊ฐ๋ค. ์ถํ์ ์ฟ ๋ฎค์๋ ๋ญ๊ฐ ๊ณ ํ์ง ์ด๋ฏธ์ง๋ฅผ ๋ง์ด ์ ๋ก๋ํ ๋งํ ์๋น์ค๊ฐ ์ถ๊ฐ๋๋ฉด ์ข๊ฒ ๋ค.
(2021.01.28) ์๊ฐ๋ณด๋ค ๊ณ ํ์ง(์ฝ 5MB ์ด์) ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋ฆฌ์ฌ์ด์ง ์์ ์ด ๋ฉ๋ชจ๋ฆฌ์ CPU๋ฅผ ๋ง์ด ์ก์๋จน๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. Python์ด๋ Node.js์์ ์์ ํ ๋๋ ์์ ์๋ชจ๊ฐ ์ด๋ป๊ฒ ๋ ์ง ๊ถ๊ธํ๋ค. ํ์ฌ๋ก์๋ Go๋ก ์ํ ์ค์ธ ์ด ์์ ์ด ์์ ์๋ชจ ์ธก๋ฉด์์ ํจ์จ์ ์ธ์ง ์ ์ ์๋๋ก ํด์ฃผ๋ ๋น๊ต๊ตฐ์ด ์๋ค.
- JUnit์์ ์์ด๋์ด๋ฅผ ์ป์ด BeforeEach, AfterEach ๋ฑ์ ์ ์ํจ์ผ๋ก์จ ๊ฐ test case๋ค ๊ฐ์ ์์กด์ฑ์ ์์ฐ.
- AfterEach์์ test ์ํ ํ ์ ๋ก๋ํ ๋ฆฌ์ฌ์ด์ง ๋ ์ด๋ฏธ์ง๋ฑ์ ์ง์์ผ๋ก์จ ๊น๋ํ๊ฒ ์ด์ฉ.
- ๊ฐ๋ฐ์ ํ๋ฉด์ ๊ฒฐ๊ณผ ํ์ธ์ ์ํด ๋งค๋ฒ ํน์ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํ ์ปค๋งจ๋๋ ๋จ์ถํค๋ฅผ ์ด์ฉํ ํ์ ์์ด file watcher์์ test code๋ฅผ ์คํํ๋๋ก ์ค์ ํด๋์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ฐํธ.
์ด๋ฏธ์ง๋ฅผ ๋ฆฌ์ฌ์ด์ง ํ ์ ๋ก๋ํด์ ์ฌ์ฉ์๋ค์ด ์ ๊ทผํ ์ ์๊ฒ ํด์ผํ๋ฏ๋ก ์ ์ ๋ฆฌ์์ค๋ค์ ์ ๊ณตํ ํด๋ผ์ฐ๋ ์ธํ๋ผ๊ฐ ํ์ํ๋ค.
AWS์ S3
+ CloudFront
+ Route53
์ ์ด์ฉํ๋ค. ์ด๋ฏธ์ง ์
๋ก๋์ ๋ํ API์ ๋๋ฉ์ธ ๋ค์์ ๋ค๋ฅธ API์ ๋์ผํ์ง๋ง
์
๋ก๋ํ ์ด๋ฏธ์ง๋ https://api.xxx.xxx๊ฐ ์๋ https://storage.xxx.xxx๋ฅผ ๋ฃจํธ๋ก ์ฌ์ฉํ๋ค.
- S3 public bucket
- CloudFront
- Origin - S3 public bucket
- Alternative CNAME -
- Route53
- GoDaddy์์ ๊ตฌ๋งคํ ๋๋ฉ์ธ์ GCP์ CloudDNS์ NS์ ์ฐ๊ฒฐ๋์ด์์.
- Route53์์ drive.khumu.me Hosted Zone ์์ฑ
- GCP์ CloudDNS์์ Route53์ drive.khumu.me Hosted Zone NS๋ฅผ ๋ ์ฝ๋๋ก ์ถ๊ฐ
$ for ((i=1;i<=100;i++));
do curl -F 'image=@test_data_wallpaper.jpg' http://localhost:9001/api/images
done
๋ก์ปฌ์์ ์๋ฒ ์คํ ํ ์์ ์ปค๋งจ๋๋ฅผ ํตํด ์์ ์ ์์ฒญํ๊ณ CPU, Memory ์ฌ์ฉ๋ฅ ์ ๊ด์ฐฐํด๋ณธ๋ค.
- Orientation ๊ฐ์ ๋ฐ๋ฅธ ํ์ ์ ๋ณด ์ฐธ๊ณ - https://feel5ny.github.io/2018/08/06/JS_13/
- Exif ๋ฐ์ดํฐ ํด์ ์ฐธ๊ณ - https://github.com/dsoprea/go-exif
- jpeg์ Exif ๋ฐ์ดํฐ ์ถ์ถ ์ฐธ๊ณ - https://pkg.go.dev/github.com/dsoprea/go-jpeg-image-structure
- png์ Exif ๋ฐ์ดํฐ ์ถ์ถ ์ฐธ๊ณ - https://pkg.go.dev/github.com/dsoprea/go-png-image-structure