Scale
| ๊ตฌ๋ถ | ๊ธฐ์ค |
| ์์ง์ ์ค์ผ์ผ | ์๋ฒ ์ฑ๋ฅ ํฅ์ |
| ์ํ์ ์ค์ผ์ผ | ์๋ฒ ๋์ ์ฆ๊ฐ |
์ฟ ๋ฒ๋คํฐ์ค์์
HPA (Horizontal Pod Autoscaler)
- ๊ธฐ์ค: Pod์ ํ๊ท CPU ์ฌ์ฉ๋ฅ ๋๋ ํ๊ท ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ๋ฑ ๋ฆฌ์์ค ์ฌ์ฉ๋, ํน์ ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ(์: ์์ฒญ ์, ๋คํธ์ํฌ ํธ๋ํฝ ๋ฑ)
- ๋ณ๋์ Metrics Server๊ฐ ๋ฉํธ๋ฆญ์ ์์งํ๋ฉฐ, ์ด์ ๊ฐ์ ์์์ผ๋ก ๊ณ์ฐ desiredReplicas = ceilcurrentReplicas * ( currentMetricValue / desiredMetricValue )
VPA (Vertical Pod Autoscaler)
- ๊ธฐ์ค: ๊ฐ ํ๋์ ์ต๊ทผ CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐํ์ผ๋ก resource requests๋ฅผ ์๋์ผ๋ก ์กฐ์
- ์ฆ, Pod๊ฐ ์ค์ ๋ก ๋ง์ด ์ฐ๋ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ์ ์ ๋ฆฌ์์ค ๊ฐ์ ๊ณ์ฐํด์ request๋ฅผ ์๋์ผ๋ก ํค์ฐ๊ฑฐ๋ ์ค์
- Pod ๊ฐ์๋ ๋ฐ๊พธ์ง ์๊ณ ๊ฐ Pod ์คํ(CPU, ๋ฉ๋ชจ๋ฆฌ)์ ๋์ ์ผ๋ก ์กฐ์
- ์ญ์ Metrics Server๋ฅผ ์ด์ฉํด ๋ชจ๋ํฐ๋งํ ๋ฐ์ดํฐ๋ฅผ ํ์ฉ
Dependency Injection
- ์์กด์ฑ: ํ ๊ฐ์ฒด A๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด B์ ๋ํด ์๊ณ ์๊ณ , B์ ๊ธฐ๋ฅ์ด๋ ํ์์ด ๋ณ๊ฒฝ๋๋ฉด ๊ทธ ์ํฅ์ด A์๋ ๋ฏธ์น๋ ๊ด๊ณ๋ฅผ ๋งํ๋ค.
- B์ ๋ณํ๊ฐ A์๋ ์ํฅ์ ๋ฐ๋ ๊ฒ -> A๋ B์ ์์กดํ๋ค.
- ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ, ๊ฐ์ฒด๋ ํจ์๊ฐ ์ง์ ํ์ํ ์์กด์ฑ์ ๋ง๋ค๊ฑฐ๋ ์ฐพ์ง ์๊ณ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์
- ๊ฐ์ฒด๋ ์์ ์ด ์ฌ์ฉํ ์์กด์ฑ(์๋น์ค๋ ๋ค๋ฅธ ๊ฐ์ฒด)์ ์ง์ ์์ฑํ์ง ์๊ณ , ์ธ๋ถ์์ ์ฃผ์
๋ฐ์ ์ฌ์ฉ
- ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ ์์กด์ฑ ์์ฑ๊ณผ ์ฌ์ฉ์ด ๋ถ๋ฆฌ๋์ด ์ ์ฐ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ, ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค.
- ์ด์
- ํด๋์ค๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ ๊ฒ์ ๋ฐฉ์ง
- ์์กด์ฑ ๋ณ๊ฒฝ ์ ํด๋์ค ์์ฒด๋ฅผ ๊ณ ์น์ง ์์๋ ๋จ
- ๋จ์ ํ ์คํธ ์ ๋ชจ์ ๊ฐ์ฒด(mock)๋ฅผ ์ฝ๊ฒ ์ฃผ์ ํด ํ ์คํธ ๊ฐ๋ฅ
- ๋ฐฉ๋ฒ
1. ์์ฑ์ ์ฃผ์ (Constructor Injection) - ๊ถ์ฅ
- ๊ฐ์ฒด ์์ฑ ์ ํ์ํ ์์กด์ฑ์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ ๋ฐ๋ ๋ฐฉ์
- ์ฃผ์ ์ด ๋ช ํํ๊ณ , ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ(immutable) ์์กด์ฑ์ ๋ค๋ฃจ๊ธฐ์ ์ข์
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self, engine):
self.engine = engine # ์์กด์ฑ ์ฃผ์
def drive(self):
self.engine.start()
print("Car is driving")
engine = Engine()
car = Car(engine) # ์ธ๋ถ์์ Engine ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ ๋ฌ
car.drive()
2. ์ธํฐ ์ฃผ์ (Setter Injection)
- ๊ฐ์ฒด ์์ฑ ํ ๋ณ๋์ ๋ฉ์๋๋ก ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์
- ์ ํ์ ์ผ๋ก ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋, ์์กด์ฑ์ด ์๊ฑฐ๋ None์ผ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ํด์ผ ํจ
class Car:
def __init__(self):
self.engine = None
def set_engine(self, engine):
self.engine = engine
def drive(self):
if self.engine:
self.engine.start()
print("Car is driving")
else:
print("Engine not set!")
3. ํ๋กํผํฐ ์ฃผ์ (Property Injection)
- ์์ฑ(property) ํํ๋ก ์์กด์ฑ์ ์ค์ ํ๋ ๋ฐฉ์
- ํ๋ ์ฃผ์ ๊ณผ ๋น์ทํ๋ฉฐ Pythonicํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
class Car:
def __init__(self):
self._engine = None
@property
def engine(self):
return self._engine
@engine.setter
def engine(self, value):
self._engine = value
์๋ฐ์์๋ Spring Container๊ฐ ๋์ ๊ด๋ฆฌํด์ฃผ๋๋ฐ, ์ด๋ฅผ IoC(Inversion of Control)์ด๋ผ ํ๊ณ , Python์์๋ ์ถ๊ฐ๋ก Dependency Injector ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด์ IoC ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
from dependency_injector import containers, providers
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self, engine: Engine):
self.engine = engine
def drive(self):
self.engine.start()
class Container(containers.DeclarativeContainer):
engine = providers.Singleton(Engine)
car = providers.Factory(Car, engine=engine)
container = Container()
car = container.car()
car.drive()
ํ์ด์ฌ์์ *
1. ํจ์ ๋งค๊ฐ๋ณ์์์ ๊ฐ๋ณ ์์น ์ธ์ ์์ง(*args)
ํจ์์ ์ ๋ฌ๋๋ ์์น ์ธ์๋ค์ ํํ๋ก ๋ฌถ์ด ๋ฐ๋ ์ญํ
def func(*args):
print(args)
func(1, 2, 3) # ์ถ๋ ฅ: (1, 2, 3)
2. ํจ์ ํธ์ถ ์ ๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ฃํ ์ธํจํน
๋ฆฌ์คํธ, ํํ ๋ฑ ์ฌ๋ฌ ๊ฐ์ ํ ๋ฒ์ ํจ์ ์ธ์๋ก ํ์ด ๋ณด๋ผ ๋
def add(a, b):
return a + b
lst = [1, 2]
print(add(*lst)) # ์ถ๋ ฅ: 3
- *args: ์์ ๊ฐ์์ ์์น ์ธ์๋ฅผ ํํ๋ก ๋ฐ์
- **kwargs: ์์ ๊ฐ์์ ํค์๋ ์ธ์๋ฅผ ๋์ ๋๋ฆฌ๋ก ๋ฐ์
- ํจ์ ํธ์ถ ์ *: ๋ฆฌ์คํธ๋ ํํ ๋ฑ ๋ฐ๋ณต ๊ฐ๋ฅ ๊ฐ์ฒด๋ฅผ ์ธํจํนํด์ ์์น ์ธ์๋ก ๋๊ธฐ๋ ์ญํ
- ํจ์ ํธ์ถ ์ **: ๋์ ๋๋ฆฌ๋ฅผ ํค์๋ ์ธ์๋ก ์ธํจํนํด์ ๋๊ธฐ๋ ์ญํ
Mutable, Immutable
| ๋ถ๋ฅ | ์ฃผ์ ์์ | ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ |
| ๊ฐ๋ณํ | list, dict, set | O |
| ๋ถ๋ณํ | int, float, str, tuple | X |
'๐ปโโ๏ธ ์ ๊ณต๊ณต๋ถ > ๋ฉด์ ๋๋น' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๊ธฐ์ตํด์ผ ํ ๊ฐ๋ ๋ค(2) (1) | 2025.10.01 |
|---|---|
| RDBMS (1) | 2025.06.22 |