-
[Golang] 마이크로서비스 공통패턴개발언어/Go 2020. 10. 14. 01:00
마이크로 서비스를 구성할 때에는 아래와 같은 패턴을 고려해서 설계하는 것이 좋다.
1. 이벤트처리
기존에 알려진 위치에 있을 수도 있고 없을 수도 있는 서비스에 직접 연결하는 대신, Kafka 같은 큐에 이벤트를 보내서 처리하는게 좋다. 특정 시점에 에러가 발생했을 경우, 그 특정 시점의 에러 메세지를 기반으로 메세지에 추가적인 정보를 보완해서 큐에 다시 추가할 수 있다. 메세지를 처리하지 못할 때마다 에러를 추가하는 것이 중요한데, 처리 시도 횟수를 기억하고 있다가 특정 횟수를 초과하면 이 메세지를 진단 정보를 사용하기 위한 두 번째 큐로 옮기게끔 설계하는게 좋다. 이 두번째 큐는 일반적으로 dead letter 큐라고 하며, 이 처리 불가 큐는 메세지가 처음 시작된 큐에 의해 지정된다.
2. Timeout
주어진 시간 내에 응답을 받지 못하면 다시 시도하거나 업스트림 서비스에 실패 메세지를 다시 보내는 등 실패를 처리할 비즈니스 논리를 작성해야한다.
3. Backoff
첫 번째 실패 이후 다시 시도하기 전에 설정된 시간동안 대기하는데, 이 대기 시간은 요청에 성공하기 전까지 실패할 때마다 점점 늘어 최대 시간까지 늘어나게 한다.
4. Circuit Breaker
마이크로 서비스들이 정상 작동하는 상태에서는 트래픽이 정상적으로 흐른다. 하지만 사전에 결정된 에러의 임계치(threshold)를 초과하면 모든 요청은 시도조차 하지 않고 즉시 실패한다. 일정 시간이 지나고나면 추가 요청이 허용되고 회로가 반 개방 상태가 된다. 이 과정에서 일부 요청이 에러 없이 처리되면 회로가 다시 닫힌 상태로 돌아가게끔 설계해야한다.
5. Health Check
서비스가 살아있는지 주기적으로 체크해야하는데, 헬스체크시에 아래의 내용을 체크할 수 있도록 구현하는 것이 좋다.
- 데이터 저장소 연결 상태(일반 연결 상태, 연결 풀 상태)
- 현재 응답 시간(이동 평균)
- 현재 연결
- 잘못된 요청(평균 실행 소요시간)
6. Throttling
서비스가 처리할 수 있는 연결 수를 제한하고 이 임계치를 초과하면 HTTP 에러 코드를 리턴하도록 한다.
7. 서비스 탐색
내부 서비스 간 통신을 위한 공개 API에는 서버측 서비스 탐색이 적합할 수도 있지만, 장애 발생시 일어나는 일들을 보다 잘 제어하기 위해 클라이언트측 서비스 탐색을 추천한다. 클라이언트측 서비스 탐색을 하면 계단식 에러를 막을 수 있다. 본질적으로 클라이언트가 서비스 탐색 및 부하 분산을 담당한다.
8. LoadBalancing
9. Caching
서비스의 성능을 향상시키기 위해 DB 사용보다는 in-memory cache나 Redis와 같은 보조적인 캐시에 캐시하는 것을 고려하는 것이 좋다.
'개발언어 > Go' 카테고리의 다른 글
[Golang] Mysql 연결하기 (0) 2020.10.25 [Golang] RPC API (0) 2020.10.12 [Golang] go에서 RPC 다루기 (0) 2020.10.11 [Golang] net/http 패키지 (0) 2020.09.30 [golang] 마샬링(Marshaling) (0) 2020.09.26