- Java
- go
- aws ses
- SAA-CO3
- 메일 인증 프로토콜
- DevOps
- SMTP
- JVM
- K8S
- SAA-CO2
- dMarc
- gochannel
- EKS
- Certified Solutions Architect
- eventbridge
- cloudnative
- Datadog
- DKIM
- kubernetesstudyguide
- aws
- SPF
- Lambda
- containerorchestration
- CKA
- kubernetesadmin
- nodeaffinity
- Fargate
- kubernetesscheduling
- Kubernetes
- Today
- Total
DevOps Tasks
AWS Lambda 에 go routine, channel 적용으로 실행 속도 대폭 개선 본문
AWS Lambda 와 Go 를 적용하기 전 Lambda에 를 최대 효율로 사용하는 방법에 대해서 알면 도움이 된다.
AWS Lambda 를 100% 활용하기
Lambda는 AWS에서 제공하는 Serverless 컴퓨팅 플랫폼이다. Serverless 란, 서버가 없다는 것이 아닌 개발자가 서버의 존재를 신경 쓸 필요가 없다는 뜻이다. 서버가 잘 돌아가고 있는지, 서버 수 및 스펙
rldnjsdlsi.tistory.com
AWS Lambda로 간단한 Proxy 서버를 구성한다.
대용량 트래픽에도 대응하기 위해 Go Routine으로 동시성을 높이고
Routine 간의 데이터 교환을 Go Channel 로 허용하여 동시작업이 제한된 방식으로 실행한다.
또한, Performance 비교로 실행 속도 또한 개선하였다.
Go Routine
Go Routine 은 Go 런타임에 의해 관리되는 Go의 경량 Thread 이다.
기존 Thread 보다 더 효율적이므로 개발자는 무거운 Thread의 오버헤드 없이 동시 작업을 쉽게 실행할 수 있다.
Go Channel
채널은 Go Routine 이 실행을 통신하고 동기화하는 방법을 제공한다.
이는 Go Routine 간의 안전한 데이터 교환을 허용하여 동시 작업이 제어된 방식으로 실행되도록 보장한다.
Go Routine 끼리 메시지를 전달할 수 있는 메세지 큐이고 간단하게 Routine 간의 통신 채널이라고 보면 된다.
Apply Routines, Channel
for hostPattern, dir := range hostToDirectory {
if strings.Contains(hostHeader, hostPattern) {
directory = dir
break
}
}
적용 전에는 hostPattern과 일치하는 패턴을 찾기 위해서 맵을 순차적으로 반복했다.
ch := make(chan string, len(hostToDirectory))
var wg sync.WaitGroup
for hostPattern, dir := range hostToDirectory {
wg.Add(1)
go processHostPattern(hostHeader, hostPattern, dir, ch, &wg)
}
go func() {
wg.Wait()
close(ch)
}()
directory := <-ch
go processHostPattern을 사용해서 각 패턴에 대한 Routine을 생성한다.
sync.WaitGroup Channel을 닫기 전 모든 Routine 이 완료될 때까지 기다린다.
ch 동시 처리를 패턴 수로 제한하하기 위해 버퍼링 된 Channel 생성한다.
일치하는 디렉터리는 각 Routine에서 Channel로 전송된다.
동시성
Go Routine을 사용하면 작업을 동시에 실행할 수 있어 대용량 트래픽 시나리오에서 성능이 향상되므로 적합하다고 볼 수 있다.
자원 효율성
Go Routine 은 기존 Thread 보다 가볍기 때문에 시스템 리소스를 효율적으로 사용할 수 있다.
동기화
채널은 경쟁 조건을 피하면서 Go Routine 이 실행을 통신하고 동기화할 수 있는 안전한 방법을 제공한다.
확장성
이 방식은 호스트 패턴 수가 증가함에 따라 확장되므로 시스템이 더 많은 수의 요청을 효율적으로 처리할 수 있다.
전반적으로 Go Routine과 Channel 을 적용하면 동시성 요구 사항이 높은 시나리오에서 코드의 성능과 확장성을 크게 향상할 수 있다.
그러나 다양한 운영 시나리오에서 올바른 동작을 보장하려면 코드를 신중하게 설계하고 테스트하는 것이 중요할 것이다.
Performance Results
Go Routine 과 Go Channel 적용 전 후 실행 속도를 비교해 본다.
DurationInMS AVG
2.321 ms
DurationInMS AVG
1.137 ms
적용 전후를 비교해 보면 Invocations는 증가했지만 Duration은 현저히 감소했다.
Go Routine과 Go Channel 적용 후 50.9 % 의 실행 속도 개선 효과!
'GO' 카테고리의 다른 글
AWS Parameter Store, 대량의 파라미터 관리 어떻게 해결할까? Go와 Cobra로 만든 CLI 개발기 (0) | 2024.12.03 |
---|---|
AWS Lambda 와 Golang base64 Encoding 적용하기 (0) | 2024.01.11 |
Go 란? (0) | 2023.12.26 |