>  기사  >  백엔드 개발  >  Go 및 GoFr의 컨텍스트 이해 및 활용

Go 및 GoFr의 컨텍스트 이해 및 활용

WBOY
WBOY원래의
2024-07-17 04:51:42649검색

Context in go

컨텍스트란 무엇인가요?

Go에서 컨텍스트 패키지는 애플리케이션의 다양한 계층에서 요청 범위 데이터, 취소 신호, 시간 초과 또는 기한을 관리하고 공유하도록 설계된 기본 도구입니다.
context.Context 유형은 연결 가능한 계층적 방식으로 기한, 취소 신호 및 기타 요청 범위 값을 전달하는 방법을 제공합니다. 불변으로 설계되었습니다. 즉, 새로 파생된 각각의 컨텍스트는 상위 컨텍스트의 속성을 전달하면서 새로운 값이나 동작을 추가한다는 의미입니다.
특정 작업에 필요한 모든 정보와 지침을 담는 특수 캐리어 가방으로 컨텍스트를 상상해 보세요. 이 백은 기능 간에 전달될 수 있으므로 관련된 모든 사람이 동일한 컨텍스트(정보)를 갖고 그에 따라 행동할 수 있습니다. 필요한 경우 작업을 중지할 수 있는 자체 파괴 버튼(취소 신호)도 포함될 수 있습니다.


컨텍스트가 필요한 이유는 무엇인가요?

Go에 Context를 도입하기 전에는 요청 범위 데이터 및 취소 신호를 관리하는 것이 번거로운 작업이었습니다. 개발자는 함수와 고루틴 간에 데이터와 신호를 공유하기 위해 사용자 정의 구조체를 전달하거나 전역 변수를 사용하는 등의 임시 솔루션에 의존해야 했습니다. 그러나 이러한 접근 방식은 오류가 발생하기 쉽고 유지 관리가 어려웠으며 종종 구성 요소 간의 긴밀한 결합으로 이어졌습니다.
컨텍스트의 필요성은 프로그램의 많은 작업이 비동기식, 동시성 또는 외부 시스템에 종속된다는 사실에서 발생합니다. 이러한 경우 취소 신호, 기한, 요청 범위 데이터를 여러 기능과 고루틴에 전파할 수 있는 방법이 있어야 합니다.

컨텍스트의 필요성을 설명하기 위해 몇 가지 시나리오를 고려해 보겠습니다.

1. 레스토랑 비유

당신이 북적거리는 식당에서 주문을 받는 사람이라고 상상해 보세요. 주문이 도착하면 숙련된 요리사 중 한 명에게 주문을 할당합니다. 그런데 고객이 갑자기 떠나기로 결정했다면 어떻게 될까요? 주저하지 않고 재료 낭비를 피하기 위해 요리사에게 해당 주문 처리를 중단하라고 알릴 것입니다. 이 시나리오는 Go에서 컨텍스트가 작동하는 방식을 반영합니다.

  • 취소 전파: 레스토랑 비유에서 고객이 떠나는 것은 취소 신호에 해당합니다. 마찬가지로 Go에서는 컨텍스트를 통해 취소 신호가 정상적으로 전파될 수 있습니다. 상위 작업(예: HTTP 요청 핸들러)이 취소되면 관련된 모든 하위 작업(예: 데이터베이스 쿼리 또는 API 호출)이 즉시 종료됩니다. 이를 통해 리소스 누출을 방지하고 효율적인 정리가 가능합니다.

2. 느린 API 및 시간 초과 처리

애플리케이션이 외부 API에 웹 요청을 하거나 시스템 명령을 실행한다고 가정해 보세요. 프로덕션 등급 시스템에서는 시간 제한을 설정하는 것이 중요합니다. 이유는 다음과 같습니다.

  • API 종속성: 서비스가 외부 API에 의존한다고 상상해 보세요. 해당 API가 느리게 실행되거나 응답하지 않는 경우 시스템이 보류 중인 요청으로 백업되는 것을 원하지 않을 것입니다. 시간 초과는 API 호출이 지정된 기간을 초과하는 경우 관련 컨텍스트가 취소되어 애플리케이션이 상황을 적절하게 처리할 수 있도록 보장합니다.

  • 성능 저하: 시간 초과가 없으면 외부 속도가 느려짐
    종속성은 계단식 효과로 이어질 수 있습니다. 백로그된 요청은 로드를 증가시키고 성능을 저하시키며 전체 시스템 응답성에 영향을 미칩니다. 기한이 있는 컨텍스트를 사용하면 이 문제를 방지할 수 있습니다.



컨텍스트 사용:

Go의 컨텍스트 패키지는 다목적이며 다양한 시나리오에서 요청 범위 데이터, 취소 신호 및 시간 초과를 관리하는 데 사용됩니다.

다음은 몇 가지 일반적인 실제 사용 사례입니다.

1. 분산 서비스 전체에 추적 ID 전파
마이크로서비스 아키텍처에서는 모니터링 및 디버깅을 위해 다양한 서비스에 걸쳐 요청을 추적하는 것이 중요합니다. 컨텍스트 패키지를 사용하면 서비스 경계에 걸쳐 추적 ID 및 기타 메타데이터를 전파하여 요청 수명 주기 전반에 걸쳐 일관된 로깅 및 추적 정보를 보장할 수 있습니다.

2. 인증 토큰 전달
많은 애플리케이션에서 인증 토큰이나 사용자 정보는 애플리케이션의 다양한 계층을 통해 전달되어야 합니다. 컨텍스트 패키지는 이를 처리하는 깔끔한 방법을 제공하여 추가 매개변수로 함수 서명을 오염시키지 않고 필요할 때 인증 정보를 사용할 수 있도록 보장합니다.

3. WebSocket 및 스트리밍 API
WebSocket 및 스트리밍 API에서 Context는 연결 수명을 관리하고 사용자 ID 및 세션 정보와 같은 요청 범위 데이터를 전파하는 데 사용됩니다. 이를 통해 인증, 속도 제한, 세션 관리 등의 기능을 효율적으로 구현할 수 있습니다.


Go의 다양한 유형의 컨텍스트:

Go의 컨텍스트 패키지는 컨텍스트 객체를 생성하고 조작하는 여러 가지 방법을 제공합니다. 일반적으로 사용되는 유형은 다음과 같습니다.

1. 배경 컨텍스트/TODO 컨텍스트

이것은 가장 기본적인 맥락이자 빈 출발점 역할을 합니다. 취소 신호나 기한을 전달하지 않습니다. 특정 컨텍스트가 필요하지 않을 때 사용하세요.
Background 대신 TODO를 사용하는 유일한 경우는 구현이 불분명하거나 컨텍스트를 아직 알 수 없는 경우입니다.

주로 주요 기능, 초기화, 테스트 등에 사용됩니다.

ctx := context.Background()
ctx2 := context.TODO()

2. context.WithCancel

상위 컨텍스트에서 파생된 새 컨텍스트를 생성합니다. WithCancel 메서드는 취소 함수와 함께 상위 컨텍스트의 복사본을 반환합니다. 취소 함수를 호출하면 컨텍스트와 연결된 리소스가 해제되며 Context 유형의 작업이 최종적으로 완료되자마자 호출되어야 합니다.

특정 조건이 충족되면 고루틴에서 작업을 취소하는 데 사용됩니다.

parentCtx := context.Background()
ctx, 취소 := context.WithCancel(parentCtx)
defer cancel() // 리소스 정리

3. context.WithDeadline

자신에게 마감일을 정하는 것과 마찬가지로 상황에 따라 마감일을 설정할 수 있습니다. Go는 완료하기 위해 지정한 시간 제한에 도달하면 자동으로 컨텍스트를 취소합니다. 특정 기한이 있는 상위 컨텍스트에서 파생된 새 컨텍스트를 생성합니다.

작업 완료 기한이 정해져 있는 경우 유용합니다.

parentCtx := context.Background()
마감일 := time.Now().Add(10 * time.Second)
ctx, 취소 := context.WithDeadline(parentCtx, 마감일)
defer cancel() // 리소스 정리

4. context.WithValue

관련된 키-값 쌍을 사용하여 상위 컨텍스트에서 파생된 새 컨텍스트를 생성합니다. 이를 통해 컨텍스트 내에서 요청별 정보를 저장하고 검색할 수 있습니다. WithValue는 상위 컨텍스트를 수락하고 컨텍스트 복사본을 반환합니다. 결과적으로 값을 덮어쓰는 대신 새 키-값 쌍으로 새 복제본을 생성합니다.

인증 토큰이나 추적 ID와 같은 컨텍스트를 통해 요청 범위 데이터를 전달하는 데 유용합니다.

parentCtx := context.Background()
userIDKey := "인증 토큰"
ctx := context.WithValue(parentCtx, userIDKey, "abc123")

5. context.WithTimeout

연관된 시간 초과가 있는 컨텍스트를 생성합니다. 지정된 기간이 지나면 컨텍스트가 자동으로 취소됩니다. WithTimeout을 사용하면 프로그램이 중단될 수 있는 위치에서 계속 진행하여 최종 사용자에게 더 나은 경험을 제공할 수 있습니다. 상위 컨텍스트와 함께 짧은 기간을 매개변수로 허용하고 제한 시간을 초과하여 실행되면 함수를 종료합니다.

작업 마감일을 설정하는 데 유용합니다.

parentCtx := context.Background()
ctx, 취소 := context.WithTimeout(parentCtx, 5*time.Second)
defer cancel() // 리소스 정리

Different types of context in Golang



GoFr 컨텍스트: Go 애플리케이션을 위한 강화된 컨텍스트

이제 Go에서 컨텍스트의 힘을 살펴봤으니 GoFr이 GoFr Context를 통해 어떻게 한 단계 더 발전했는지 살펴보겠습니다.

GoFr은 Go를 기반으로 구축된 독창적인 마이크로서비스 개발 프레임워크입니다. 강력하고 확장 가능한 마이크로서비스를 구축하기 위한 구조화된 접근 방식을 제공하여 개발 프로세스를 간소화하는 것을 목표로 합니다.

GoFr Context는 주위에 래퍼를 생성하여 표준 Go 컨텍스트 패키지의 기능을 아름답게 확장합니다. 이 래퍼는 컨텍스트 개체를 통해 직접 액세스할 수 있는 사전 구성된 다양한 종속성 세트를 제공합니다. 완전히 로드된 이 컨텍스트를 통해 개발자는 단일 컨텍스트 개체에서 로깅, 데이터베이스 연결, 기본 서비스, 추적 및 메트릭에 모두 원활하게 액세스할 수 있습니다.

func MyHandler(c *gofr.Context) (interface{}, error) {
  // Logging
  c.Info("Processing request...")

  // Database access
  var value int
  err := c.SQL.QueryRowContext(c, "select 2+2").Scan(&value)
  if err != nil {
    return nil, datasource.ErrorDB{Err: err, Message: "error from sql db"}
  }

  // Accessing another service
  resp, err := c.GetHTTPService("anotherService").Get(c, "book", nil)
  if err != nil {
    return nil, err
  }

  // Creating a tracing span
  span := c.Trace("some-sample-work")
  defer span.End()
  // ... perform some work

  return value, nil
}

이 예에서는 GoFr 컨텍스트 개체를 통해 로깅(c.Info), 데이터베이스 상호 작용(c.SQL), 서비스 호출(c.GetHTTPService) 및 추적(c.Trace)과 같은 기능에 직접 액세스하는 방법을 확인하세요. (c).

GoFr 컨텍스트는 모든 HTTP 처리기에서 사용할 수 있으며, 애플리케이션의 다양한 측면을 관리하는 중앙 집중식 방법을 제공하여 개발 경험을 크게 향상시킵니다. 이러한 통합을 통해 개발자는 GoFr의 효과적인 컨텍스트 관리 기능을 활용하면서 비즈니스 로직에 집중할 수 있습니다.


결론

프로그램 디자인과 관련하여 Golang 컨텍스트 패키지는 매우 유용한 도구입니다. Go의 컨텍스트는 요청 범위 데이터, 취소 신호 및 기한을 관리하기 위한 강력한 도구 역할을 합니다. 마이크로서비스, API, 웹 애플리케이션 등 무엇을 구축하든 컨텍스트는 깔끔한 리소스 처리와 일관된 동작을 보장합니다.

GoFr을 확인하고 Github Repo를 확인하고 ⭐를 제공하여 지원하세요.

위 내용은 Go 및 GoFr의 컨텍스트 이해 및 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.