medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7
์ดํดํ ๋ฐ๋ฅผ ์ ๋ฆฌ
์ํํธ์จ์ด์ ๋ชฉ์ ์ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์์ํ ๋ฐ์ดํฐ๋ก ๋ณํ์ํค๋ ๊ฒ์ด๋ค.
Backpressure๋ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์์ํ ๋ฐ์ดํฐ๋ก ๋ณํ์ํค๋ ๊ณผ์ ์ ๋ชจ์ข ์ ์ด์ ๋ก ์ ํญ์ด ์๊ธฐ๋ ๋๋ฅผ ๋งํ๋ค.
๋๊ฐ ์ ํญ์ ๊ณ์ฐ ์๋์ธ๋ฐ - ์ธํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์๋์ ๋น ๋ฅด๊ธฐ๋งํผ ์์ํ์ ๊ณ์ฐํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด๋ค. ๊ทธ ์ธ์ ์ฌ์ฉ์์๊ฒ ์ก์ ์ ๋ฐ๊ธฐ ์ํด ์ํํธ์จ์ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๋ backpressure๋ผ๊ณ ๋ ํ ์ ์๋ค.
์๋ค
I Love Lucy ์์์ ์
์ปจ๋ฒ ์ด์ด ๋ฐธํธ๋ฅผ ํตํด ์ธํ ์์ดํ ์ด ๊ณ์ ํด์ ๋ค์ด์ค๋๋ฐ ์ธํ ์์ดํ ์ ์์ํ ์์ดํ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ backpressure๊ฐ ๋ฐ์ํ๋ค. ์ด backpressure์ ๋์ํ๊ณ ์ ์์์ ์ธ๋ฌผ๋ค์ด ํ ์ผ์ ๋์ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ธํ ์์ดํ ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๋นผ๋๋๊ฐ(buffering), ์ธํ ์์ดํ ๋ค์ ์จ๊ธฐ๊ฑฐ๋ ์์ ๋ฒ๋ ธ๋ค(dropping).
ํ์ผ ์ฝ๊ธฐ๊ณผ ์ฐ๊ธฐ
ํ์ผ ์ฐ๊ธฐ ์๋๋ ํ์ผ ์ฝ๊ธฐ ์๋๋ณด๋ค ๋๋ฆฌ๋ค.
๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์ ์ฝ์ผ๋ฉด์ ๋์์ ์ฝ์ ๊ฒ์ ๋์คํฌ์ ์ด๋ค๊ณ ํ์.
์ฝ๋ ์๋ : 150 MB/์ด
์ฐ๋ ์๋ : 100 MB/์ด
๋์์ ํ์ผ์ ์ฝ๊ณ ์ฐ๋๋ฐ ๋งค์ด (150 MB-100 MB = 50 MB)50MB์ ๋ฒํผ๊ฐ ํ์ํ๋ค. ์ฆ๊ฐํ๋ ๊ฒฐ์/์์ค/์ ์(deficit)์ด๋ค. ํ์ผ ์ฝ๊ธฐ๊ฐ ๋๋ ๋๊น์ง ํ์ผ ์ฝ๊ธฐ๋ ๋๋์ง๋ ๋ชปํ๊ณ ๊ฒฐ์(์์ง ์ฝ์ง ๋ชปํ ๋ฐ์ดํฐ)๋ ํด๊ฒฐํ์ง ๋ชปํ๋ค.
6GB ํ์ผ์ ๋์์ผ๋ก ์ฝ๊ณ ์ด๋ค๊ณ ํ๋ฉด, ์ฐ๊ธฐ๋ฅผ ๋ค ๋๋ด๊ธฐ ์ํด 2GB์ ๋ฒํผ๊ฐ ํ์ํ๋ค.
6 GB / 150 MB = 40์ด
150 MB - 100 MB = 50 MB์ ๊ฒฐ์
50 MB x 40 = 2 GB
์ด๊ฑด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ค.
ํด๊ฒฐ์ฑ : ์ฐ๋ ์๋๋ก ํ์ผ์ ์ฝ์ผ๋ฉด ๋๋ค.
์๋ฒ ํต์
์๋ฒ๊ฐ ํต์ ์์ ์์ฃผ ๋ฐ์.
ํ ์๋ฒ๊ฐ ๋ค๋ฅธ ์๋ฒ๋ก ์์ฒญํ๋ ์๋๊ฐ, ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋๋ณด๋ค ๋น ๋ฅผ ๋ ๋ฐ์ํ๋ค.
A ์๋ฒ -> B ์๋ฒ -> C ์๋ฒ
B์๋ฒ๊ฐ A์๋ฒ๋ก ๋ถํฐ ์์ฒญ์ ๋ฐ๋ ์๋ > B์๋ฒ๊ฐ A์๋ฒ์ ์์ฒญ์ ์ฒ๋ฆฌ(ํด C์๋ฒ๋ก ์์ฒญ)ํ๋ ์๋
B์๋ฒ์์ ์ ์ฒด๊ฐ ์๊ธด๋ค.
B์๋ฒ์์ ๋ฒํผ๋ฅผ ์ฐ๋ฉด(Buffering) deficit(๊ฒฐ์)์ด ๊ณ์ ์ฆ๊ฐํ ํ ๊ณ , ๋ค๋ฅธ ์์ฒญ๋ค์ ๋ํ ์์ ๋ค๋ ์งํํ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก B์๋ฒ๊ฐ ๋ปฃ์ด๋ฒ๋ฆด ๊ฒ์ด๋ค. ์์ฒญ์ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ(Dropping)์ ํ์ฉํ๊ธฐ๋ ํ๋ค๋ค.
์ด์์ ์ธ ์ ํ์ ์๋ฒ B๊ฐ ์๋ฒ A์ ์์ฒญ ์๋๋ฅผ ํต์ ํ๋ ๊ฒ.
์๋ฅผ ๋ค์ด, ์๋ฒ A, ์๋ฒ B, ์๋ฒ C๊ฐ ๋์ผํ downstream ์๋น์ค Z์ ์์ฒญ์ ๋ณด๋ธ๋ค. ์๋ฒ ์ค ํ๋(A)์ ์์ฒญ ์๋๊ฐ ๋น ๋ฅผ ๋, ์๋น์ค Z๋ A์๊ฒ ์๋๋ฅผ ๋ฆ์ถ ๊ฒ์ ๋งํด์(producer๋ฅผ ํต์ ) A๊ฐ ์์ฒญ์ ๋ฒํผ๋งํ๊ณ ๊ฒฐ๊ตญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ๋๋ก ํ๋ค. ์๋ฒ B,C์ ์๋น์ค๋ ๋์ผํ๊ฒ ์ ์งํ๋ค. ์๋น์ค ํ๋๊ฐ ์๋ชป๋๋ ๋ค๋ฅธ ์๋น์ค๋ค๊น์ง ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ฒ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๊ฒฝ์ฐ ๊ธฐ๋ฅ ์ ์ง๊ฐ ๋ถ๊ฐํผํ์ง๋ง, ์ด ๋ฒ์๊ฐ ์ ํ๋๊ณ ์ฐ์์ ์ธ ์๋น์ค ๊ฑฐ๋ถ๋ฅผ ์๋ฐฉํ ์ ์๋ค. ์ด๊ฒ์ ์ค์ producer(์ ์ )๋ฅผ ํต์ ํ ์ ์๊ธฐ์ ๋ฒํผ๋งํ๋ producer๋ฅผ ํต์ ํ๋ ๊ฒฝ์ฐ์ด๋ค. ๋๊ตฐ๊ฐ(์ด๋ค ์๋ฒ)๋ ๋ฒํผ๋ง์ ํด์ผํ๊ณ , ์ด '๋๊ตฌ'๋ ์ค์ํ ๋ถ๋ถ์ด๋ค.
UI ๋ ๋๋ง
ํด์ผํ๋ ๋งํผ ๋น ๋ฅด๊ฒ ๋ ๋๋ง ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ์ backpressure๊ฐ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด, ์์ฒญ ํฐ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํด์ผ ํ๋ค๋์ง, ๋น ๋ฅธ ํค๋ณด๋ ์ด๋ฒคํธ๋ค์ ๋๋ฐ์ด์ฑํ๋ค๋์ง, ๋งค ์ด 2๋ง๊ฐ์ ์ด๋ฒคํธ๋ฅผ emitํ๋ WebSocket์ ์์ํ์ ๋์คํ๋ ์ด์ ๋ ธ์ถ์ํค๋ ๋ฑ์ ๋ ๋ณต์กํ ์ํฉ๋ค์ด ์๋ค.
Backpressure ์ ๋ต
-producer๋ฅผ ํต์ (Control)(consumer์ ์ํด ์๋๋ฅผ ๋ฆ์ถ๊ฑฐ๋ ๋์ด๊ฑฐ๋)
-Buffer(๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ๊ธ๋ฑ์ ์ผ์์ ์ผ๋ก ๋ชจ์๋ค.)
-Drop(๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค์ ์ผ๋ถ๋ฅผ ์ถ์ถํ๋ค.)
-backpressure๋ฅผ ๋ฌด์ํ๋ค. backpressure๊ฐ ์น๋ช ์ ์ธ ์ด์๋ฅผ ๋ง๋ค์ง ์๋๋ค๋ฉด ๋ง์ด๋ค.
-pruducer๋ฅผ controlling
์ต๊ณ ์ ๋ฐฉ๋ฒ. producer๋ฅผ ํต์ ํ๋๊ฒ ํญ์ ๊ฐ๋ฅํ์ง๋ ์๋ค.
-buffering
๋ฌดํํ ๋ฒํผ๋ง์ ์ํํ๋ค. ๋ฌดํํ ๋ฒํผ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๋์์ ํํ ์์ธ์ด๋ค.
-dropping
๋ง์ง๋ง ์๋จ. ์ข ์ข ๋ฒํผ๋ง ์ด์ฉ๊ณผ ๊ฒฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋น 10% ๋ฐ์ดํฐ์ ๊ฐ์ด, ๋๊ฐ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋กํ๋ ๊ฒ์ด ํํ๋ค.
UX์ ๋ง๊ฒ ์ ๋ต์ ์ ํํ๋ฉด ๋๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Delegation Pattern (0) | 2021.03.05 |
---|---|
[Kotlin] Delegation (0) | 2021.03.05 |
[Kotlin Coroutines] Channels (0) | 2021.03.02 |
[Android] java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView() (0) | 2021.03.02 |
[Kotlin Coroutines] ObsoleteCoroutinesApi (0) | 2021.02.24 |