์ต๊ทผ์๋ ๋ง์ ๊ธฐ์ ๊ณผ ์กฐ์ง์ด MSAํ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค.
ํ์ง๋ง MSA ํ์์ผ๋ก ๊ฐ๋ฐํ๋ค๋ฉด, ์ฌ๋ฌ ๋ถ์ฐ๋ ์๋ฒ๋ค์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ํ ๋์ ์ดํด๋ณด๊ธฐ ์ด๋ ต๊ณ , ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ต๋ค.
Pinpoint : ๋ถ์ฐ์ถ์
๋ค์ด๋ฒ์์ ๋ง๋ ์คํ์์ค APM(์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง)์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ก, ์๋ฒ์ ํธ๋ํฝ ์ฆ๊ฐ ๋ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ๊ฐ์, ๋ณ๋ชฉ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฒ๋ฅผ ์ถ์ ํ์ฌ ํ์ธํ ์ ์๋ค.
ํนํ, ๋ถ์ฐ ์ถ์ ์ ์ฉ์ดํ ํด์ด๋ค.
์ ์ฅ์๋ HBase๋ฅผ ์ฌ์ฉํ๋ค.
Hadoop์ HDFS์์ ๋ง๋ค์ด์ง ๋ถ์ฐ ์ปฌ๋ผ ๊ธฐ๋ฐ์ ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
HBase์ Rowkey๋ฅผ ๋ง๊ฒ ์ค๊ณํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
ex) ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ + ์๊ฐ์ ์กฐํฉ
Pinpoint ๊นํ๋ธ
https://github.com/pinpoint-apm/pinpoint
์ถ์ฒ https://d2.naver.com/helloworld/1194202
์์ ๊ฐ์ด ์๋น์ค ๋ด์ ์์ฒญ๊ณผ ์ ๋ณด๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค.
์ด๋ฅผ ํตํด ์ ์ ๊ฐ ์ด๋ ์๋น์ค์์ ์์ฒญ์ ๋ชป ๋ฐ์๋์ง, ๋๋ ์ด๋์ ์ง์ฐ์ด ๋๋์ง ํ์ธํ ์ ์๋ค.
Scatter Chart
PinPoint์์ ํ์ธํ ์ ์๋ Scatter Chart์ด๋ค.
ํด๋น ์ ์ ์ธ๋ถ์์ ๋ค์ด์จ ์๋น์ค ์์ฒญ์ ๋ปํ๋ค.
๊ฐ ์ ์ ์ ํํ๋ฉด ์์ ์๊ฐ, Path, IP, TransactionID๋ฑ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค.
Rowkey๋ฅผ ์ ์ ํ๊ฒ ์ค๊ณํ๋ค๋ฉด, ํจ์จ์ ์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํ ์ด๋ธ์๋ ๋ ๊ฐ์ง์ ColumnFamily๊ฐ ์๋ค.
- Index ColumnFamily
ScatterChart์์ ์ ์ ํํํ ์ ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ Scatter Chart๋ฅผ ๊ทธ๋ฆฌ๊ฒ ๋๋ค. - Meta Column Family
๊ฐ ์์ฒญ์ ๋ํ ์ ๋ณด๋ค์ ๋ชจ์๋๋๋ค.
TransactionId๋ ์์ฒญ์ ๋ฐ์ ApiGatway์์ ๋ง๋ ๋ค.
์ด ์์ฒญ์ ์ํด์ ํ์๋ ์์ฒญ์ ๋์ผํ TransactionId๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
TransactionId๋ Meta ColumnFamily์ Qualifer์ TransactionId๋ฅผ ์ ์ฅํ๋ค.
์ด TransactionId๋ฅผ ํตํด์ ํน์ ์๊ฐ์ ์์ฒญ์ ์กฐํํ๊ณ , ๋์ผํ TransactionId๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ์๋น์ค๊ฐ ํธ์ถ๋ ์์ฒญ์ ์ฐพ์๋ผ ์ ์๋ค.
์ด๋ฅผ ์ด์ฉํด์ ์์ฒญ ์ค๊ฐ์ ๋ถํ์ํ ์์ฒญ์ ์ถ์ ํ์ฌ ๋ถํ์ํ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
๋น๋๊ธฐ ๋ฐฉ์ ์ฒ๋ฆฌ
์๋ฒ์ ์์ฒญ์ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ ๋ณด๋ค, ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ ์๋ฒ์ ๋จธ๋ฌด๋ฅด๋ ์๊ฐ์ ์ค์ผ ์ ์๊ณ , ๋์์ ์ฌ๋ฌ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ด์ ๊ฒฝ์ฐ๋ ํด๋น ์์ฒญ์ด ๋๊ธฐ ๋ฐฉ์์ ํตํด์ ๋ฐ์ดํฐ์ return์ด ํ์ํ์ง, ํ์ธ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋์ง ํ๋จํด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.
์ฝํ๋ฆฐ์ ๊ฒฝ์ฐ, Coroutine์ ์ด์ฉํด์ ํจ์จ์ ์ธ ๋น๋๊ธฐ ๋ฐฉ์์ ์์ฒญ์ ํ ์ ์๋ค.
https://developer.android.com/kotlin/coroutines?hl=ko
๋ฐํ์์ ์ฝ๋ฃจํด์ด PinPoint๊ฐ ์ฝ๋ฃจํด์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, AsyncRestTemplate๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ListenableFuture๋ฅผ ์ฐ๊ฒฐ์์ผ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์์ง๋ง, Spring 5.0 ๋ฒ์ ์์๋ถํด AsyncRestTemplate๋ฅผ ์ง์ํ์ง ์๋๋ค.
๋ฐ๋ผ์, WebClient๋ฅผ ํตํด ๋น๋๊ธฐ REST ๋ฅผ ๋ณด๋ด๋ ์์ ๋ฅผ ์ดํด๋ณด์.
import org.springframework.http.HttpMethod;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
public class MyAsyncRestClient {
WebClient client = WebClient.create();
// ๋น๋๊ธฐ GET ์์ฒญ ๋ณด๋ด๊ธฐ
Mono<String> responseMono = client
.method(HttpMethod.GET)
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class);
// ๋น๋๊ธฐ ์๋ต ์ฒ๋ฆฌ
responseMono.subscribe(
response -> {
// ์๋ต ๋ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
System.out.println(response);
},
error -> {
// ์ค๋ฅ ์ฒ๋ฆฌ
System.err.println("Error: " + error.getMessage());
}
);
}
Web Client๋ฅผ ์ด์ฉํ์ฌ ๋น๋๊ธฐ ์์ฒญ์ ๊ตฌ์ฑํ๊ณ , subscribe ๋ฉ์๋๋ฅผ ํตํด ๋น๋๊ธฐ ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ค๋ ๋ ํ Thread Pool
์คํ๋ง ๋ด๋ถ์์๋ ์ค๋ ๋ ํ(Thread Pool)์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์์ ์ ์ํํ๋ค.
์ค๋ ๋ ํ์ ์ด์ฉํด์ ์ค๋ ๋๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ TaskExcutor ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ํ์คํฌ๋ค์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๋ค.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync //๋น๋๊ธฐ ์์
์ํ ์ค์
public class AppConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10); //Core Pool Size ์กฐ์
executor.setMaxPoolSize(50); //Max Pool Size ์กฐ์
executor.setQueueCapacity(100); //Queue ์ฉ๋ ์กฐ์
executor.setThreadNamePrefix("ThreadPool-"); //์ค๋ ๋ ์ ๋์ฌ
executor.initialize();
return executor;
}
}
@EnableAsync ์ด๋
ธํ
์ด์
์ ํตํด์ ๋น๋๊ธฐ ์์
์ด ์ฌ์ฉ๋ ์ ์๋๋ก ์ค์ ํ๊ณ ,
@Async ์ด๋
ธํ
์ด์
์ ์ด์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ด๋ ๊ฒ ์ง์ ์ค์ ํด์ค ์ ์์ง๋ง, ์คํ๋ง ๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ค.
- properties
# ์ฝ์ด ์ค๋ ๋ ์ spring.task.execution.pool.core-size=10 # ์ต๋ ์ค๋ ๋ ์ spring.task.execution.pool.max-size=50 # ์์ ํ ์ฉ๋ spring.task.execution.pool.queue-capacity=100 # ์ค๋ ๋ ์ด๋ฆ ์ ๋์ฌ spring.task.execution.pool.thread-name-prefix=MyThreadPool-
- yml
```yml
spring:
task:
execution:
pool:
core-size: 10
max-size: 50
queue-capacity: 100
thread-name-prefix: ThreadPool-
- core size : ํ ๋ด์์ ํญ์ ์ ์ง๋๋ ์ต์ ์ค๋ ๋ ์
- max-size : ํ์ด ๋์์ ๊ฐ์ง ์ ์๋ ์ต๋ ์ค๋ ๋ ์
- queue-capacity : ๋๊ธฐ์ด์ ์ ์ฅํ ์ ์๋ ์์ ์ ์ต๋ ๊ฐ์
- thread-name-prefix : ์์ฑ๋ ์ค๋ ๋ ์ด๋ฆ์ ์ ๋์ฌ
์คํ๋ง ๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ํ์ ์ง์ํ๊ธฐ ๋๋ฌธ์, ์ด์ ๊ฐ์ด ์ค๋ ๋ ํ์ ์ค์ ํด์ ์ฌ์ฉํ ์๋ ์๋ค.
'BackEnd > Server' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Apache JMeter๋ก NGNIX์ ๋ก๋๋ฐธ๋ฐ์ฑ ์ฑ๋ฅ ํ ์คํธ (0) | 2023.09.02 |
---|---|
[NGNIX] ์๋ฒ SSL ์ค์ (0) | 2023.09.02 |
[SLASH23] ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (0) | 2023.09.02 |
CORS (0) | 2023.09.02 |
aws EC2, ๊ฐ๋น์๋ฅผ ์ด์ฉํ์ฌ Spring Project ์ง์ ๋ฐฐํฌํด๋ณด๊ธฐ + SSL (0) | 2023.09.01 |