빠른 시작: Go를 사용하여 Event Hubs에서 이벤트 보내기 또는 받기Quickstart: Send events to or receive events from Event Hubs using Go

Azure Event Hubs는 초당 수백만 개의 이벤트를 수신하여 처리할 수 있는 빅 데이터 스트리밍 플랫폼이자 이벤트 수집 서비스입니다.Azure Event Hubs is a Big Data streaming platform and event ingestion service, capable of receiving and processing millions of events per second. Event Hubs는 분산된 소프트웨어와 디바이스에서 생성된 이벤트, 데이터 또는 원격 분석을 처리하고 저장할 수 있습니다.Event Hubs can process and store events, data, or telemetry produced by distributed software and devices. Event Hub로 전송된 데이터는 실시간 분석 공급자 또는 일괄 처리/스토리지 어댑터를 사용하여 변환하고 저장할 수 있습니다.Data sent to an event hub can be transformed and stored using any real-time analytics provider or batching/storage adapters. Event Hubs에 대한 자세한 개요는 Event Hubs 개요Event Hubs 기능을 참조하세요.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

이 자습서에서는 이벤트 허브와 이벤트를 주고 받는 Go 애플리케이션을 작성하는 방법을 설명합니다.This tutorial describes how to write Go applications to send events to or receive events from an event hub.

참고

GitHub에서 샘플로 이 빠른 시작을 다운로드하여 EventHubConnectionStringEventHubName 문자열을 이벤트 허브 값으로 대체하고, 실행합니다.You can download this quickstart as a sample from the GitHub, replace EventHubConnectionString and EventHubName strings with your event hub values, and run it. 또는 이 자습서의 단계를 수행하여 직접 만들 수 있습니다.Alternatively, you can follow the steps in this tutorial to create your own.

필수 조건Prerequisites

이 자습서를 완료하려면 다음 필수 구성 요소가 필요합니다.To complete this tutorial, you need the following prerequisites:

  • 로컬로 설치된 Go.Go installed locally. 필요한 경우 다음 지침을 따릅니다.Follow these instructions if necessary.
  • 활성 Azure 계정.An active Azure account. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.If you don't have an Azure subscription, create a free account before you begin.
  • Event Hubs 네임스페이스 및 이벤트 허브 만들기Create an Event Hubs namespace and an event hub. Azure Portal을 사용하여 Event Hubs 형식의 네임스페이스를 만들고, 애플리케이션에서 이벤트 허브와 통신하는 데 필요한 관리 자격 증명을 얻습니다.Use the Azure portal to create a namespace of type Event Hubs, and obtain the management credentials your application needs to communicate with the event hub. 네임스페이스 및 이벤트 허브를 만들려면 이 문서의 절차를 따릅니다.To create a namespace and an event hub, follow the procedure in this article.

이벤트 보내기Send events

이 섹션에서는 이벤트 허브로 이벤트를 전송하는 Go 애플리케이션을 만드는 방법을 보여줍니다.This section shows you how to create a Go application to send events to an event hub.

Go 패키지 설치Install Go package

go get 또는 dep 명령을 사용하여 Event Hubs용 Go 패키지를 받습니다.Get the Go package for Event Hubs with go get or dep. 예:For example:

go get -u github.com/Azure/azure-event-hubs-go
go get -u github.com/Azure/azure-amqp-common-go/...

# or

dep ensure -add github.com/Azure/azure-event-hubs-go
dep ensure -add github.com/Azure/azure-amqp-common-go

코드 파일에서 패키지 가져오기Import packages in your code file

Go 패키지를 가져오려면 다음 코드 예제를 사용합니다.To import the Go packages, use the following code example:

import (
    aad "github.com/Azure/azure-amqp-common-go/aad"
    eventhubs "github.com/Azure/azure-event-hubs-go"
)

서비스 주체 만들기Create service principal

Azure CLI 2.0을 사용하여 Azure 서비스 주체 만들기의 지침에 따라 새 서비스 주체를 만듭니다.Create a new service principal by following the instructions in Create an Azure service principal with Azure CLI 2.0. 제공된 자격 증명을 다른 이름으로 현재 환경에 저장합니다.Save the provided credentials in your environment with the following names. Go용 Azure SDK 및 Event Hubs 패키지는 다음 변수 이름을 찾도록 미리 구성됩니다.Both the Azure SDK for Go and the Event Hubs packages are preconfigured to look for these variable names:

export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=
export AZURE_TENANT_ID=
export AZURE_SUBSCRIPTION_ID= 

이제 이러한 자격 증명을 사용하는 Event Hubs 클라이언트에 대한 권한 부여 공급자를 만듭니다.Now, create an authorization provider for your Event Hubs client that uses these credentials:

tokenProvider, err := aad.NewJWTProvider(aad.JWTProviderWithEnvironmentVars())
if err != nil {
    log.Fatalf("failed to configure AAD JWT provider: %s\n", err)
}

Event Hubs 클라이언트 만들기Create Event Hubs client

다음 코드는 새 Event Hubs 클라이언트를 만듭니다.The following code creates an Event Hubs client:

hub, err := eventhubs.NewHub("namespaceName", "hubName", tokenProvider)
ctx := context.WithTimeout(context.Background(), 10 * time.Second)
defer hub.Close(ctx)
if err != nil {
    log.Fatalf("failed to get hub %s\n", err)
}

메시지를 보내는 코드 작성Write code to send messages

다음 코드 조각에서 (1) 터미널에서 대화식으로 메시지를 보내거나 (2) 프로그램 내에서 메시지를 보냅니다.In the following snippet, use (1) to send messages interactively from a terminal, or (2) to send messages within your program:

// 1. send messages at the terminal
ctx = context.Background()
reader := bufio.NewReader(os.Stdin)
for {
    fmt.Printf("Input a message to send: ")
    text, _ := reader.ReadString('\n')
    hub.Send(ctx, eventhubs.NewEventFromString(text))
}

// 2. send messages within program
ctx = context.Background()
hub.Send(ctx, eventhubs.NewEventFromString("hello Azure!"))

추가 항목Extras

이벤트 허브의 파티션 ID 가져오기:Get the IDs of the partitions in your event hub:

info, err := hub.GetRuntimeInformation(ctx)
if err != nil {
    log.Fatalf("failed to get runtime info: %s\n", err)
}
log.Printf("got partition IDs: %s\n", info.PartitionIDs)

애플리케이션을 실행하여 이벤트 허브에 이벤트를 보냅니다.Run the application to send events to the event hub.

축하합니다!Congratulations! 이제 Event Hub에 메시지를 보냈습니다.You have now sent messages to an event hub.

이벤트 수신Receive events

Storage 계정 및 컨테이너 만들기Create a Storage account and container

이벤트 스트림의 파티션 및 검사점 임대와 같은 상태는 Azure Storage 컨테이너를 사용하여 수신기 간에 공유됩니다.State such as leases on partitions and checkpoints in the event stream are shared between receivers using an Azure Storage container. Go SDK를 사용하여 스토리지 계정 및 컨테이너를 만들 수 있지만, Azure Storage 계정 정보의 지침에 따라 새로 만들 수도 있습니다.You can create a storage account and container with the Go SDK, but you can also create one by following the instructions in About Azure storage accounts.

Go SDK를 사용하여 Storage 아티팩트를 만드는 샘플은 Go 샘플 리포지토리 및 이 자습서에 해당하는 샘플에서 사용할 수 있습니다.Samples for creating Storage artifacts with the Go SDK are available in the Go samples repo and in the sample corresponding to this tutorial.

Go 패키지Go packages

메시지를 받으려면 go get 또는 dep 명령을 사용하여 Event Hubs용 Go 패키지를 받으세요.To receive the messages, get the Go packages for Event Hubs with go get or dep:

go get -u github.com/Azure/azure-event-hubs-go/...
go get -u github.com/Azure/azure-amqp-common-go/...
go get -u github.com/Azure/go-autorest/...

# or

dep ensure -add github.com/Azure/azure-event-hubs-go
dep ensure -add github.com/Azure/azure-amqp-common-go
dep ensure -add github.com/Azure/go-autorest

코드 파일에서 패키지 가져오기Import packages in your code file

Go 패키지를 가져오려면 다음 코드 예제를 사용합니다.To import the Go packages, use the following code example:

import (
    aad "github.com/Azure/azure-amqp-common-go/aad"
    eventhubs "github.com/Azure/azure-event-hubs-go"
    eph "github.com/Azure/azure-event-hubs-go/eph"
    storageLeaser "github.com/Azure/azure-event-hubs-go/storage"
    azure "github.com/Azure/go-autorest/autorest/azure"
)

서비스 주체 만들기Create service principal

Azure CLI 2.0을 사용하여 Azure 서비스 주체 만들기의 지침에 따라 새 서비스 주체를 만듭니다.Create a new service principal by following the instructions in Create an Azure service principal with Azure CLI 2.0. 제공된 자격 증명을 다음 이름으로 현재 환경에 저장합니다. Go용 Azure SDK 및 Event Hubs 패키지는 다음 변수 이름을 찾도록 미리 구성됩니다.Save the provided credentials in your environment with the following names: Both Azure SDK for Go and Event Hubs package are preconfigured to look for these variable names.

export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=
export AZURE_TENANT_ID=
export AZURE_SUBSCRIPTION_ID= 

다음으로, 이제 이러한 자격 증명을 사용하는 Event Hubs 클라이언트에 대한 권한 부여 공급자를 만듭니다.Next, create an authorization provider for your Event Hubs client that uses these credentials:

tokenProvider, err := aad.NewJWTProvider(aad.JWTProviderWithEnvironmentVars())
if err != nil {
    log.Fatalf("failed to configure AAD JWT provider: %s\n", err)
}

메타데이터 구조체 가져오기Get metadata struct

Azure Go SDK를 사용하여 Azure 환경에 대한 메타데이터로 구조체를 가져옵니다.Get a struct with metadata about your Azure environment using the Azure Go SDK. 이후 작업에서 이 구조체를 사용하여 올바른 엔드포인트를 찾을 것입니다.Later operations use this struct to find correct endpoints.

azureEnv, err := azure.EnvironmentFromName("AzurePublicCloud")
if err != nil {
    log.Fatalf("could not get azure.Environment struct: %s\n", err)
}

자격 증명 도우미 만들기Create credential helper

이전 AAD(Azure Active Directory) 자격 증명을 사용하여 Storage에 대한 SAS(공유 액세스 서명) 자격 증명을 만드는 자격 증명 도우미를 만듭니다.Create a credential helper that uses the previous Azure Active Directory (AAD) credentials to create a Shared Access Signature (SAS) credential for Storage. 마지막 매개 변수는 이전에 사용한 것과 동일한 환경 변수를 이 구문에 사용하라고 지시합니다.The last parameter tells this constructor to use the same environment variables as used previously:

cred, err := storageLeaser.NewAADSASCredential(
    subscriptionID,
    resourceGroupName,
    storageAccountName,
    storageContainerName,
    storageLeaser.AADSASCredentialWithEnvironmentVars())
if err != nil {
    log.Fatalf("could not prepare a storage credential: %s\n", err)
}

확인 포인터 및 leaser 만들기Create a check pointer and a leaser

다른 수신기가 올바른 오프셋에서 읽기를 시작할 수 있도록 파티션을 특정 수신기에게 임대하는 일을 담당하는 확인 포인터 및 메시지 스트림에 대한 검사점을 작성하는 일을 담당하는 leaser를 만듭니다.Create a leaser, responsible for leasing a partition to a particular receiver, and a check pointer, responsible for writing checkpoints for the message stream so that other receivers can begin reading from the correct offset.

현재는 동일한 Storage 컨테이너를 사용하여 임대와 검사점을 관리하는 단일 StorageLeaserCheckpointer가 제공됩니다.Currently, a single StorageLeaserCheckpointer is available that uses the same Storage container to manage both leases and checkpoints. StorageLeaserCheckpointer는 컨테이너에 올바르게 액세스하려면 스토리지 계정 및 컨테이너 이름 외에도 이전 단계에서 만든 자격 증명과 Azure 환경 구조체가 필요합니다.In addition to the storage account and container names, the StorageLeaserCheckpointer needs the credential created in the previous step and the Azure environment struct to correctly access the container.

leaserCheckpointer, err := storageLeaser.NewStorageLeaserCheckpointer(
    cred,
    storageAccountName,
    storageContainerName,
    azureEnv)
if err != nil {
    log.Fatalf("could not prepare a storage leaserCheckpointer: %s\n", err)
}

구문 이벤트 프로세서 호스트Construct Event Processor Host

이제 다음과 같이 EventProcessorHost를 작성하는 데 필요한 방법이 제공됩니다.You now have the pieces needed to construct an EventProcessorHost, as follows. 앞에서 설명했듯이, 동일한 StorageLeaserCheckpointer가 leaser 및 확인 포인터로 사용됩니다.The same StorageLeaserCheckpointer is used as both a leaser and check pointer, as described previously:

ctx := context.Background()
p, err := eph.New(
    ctx,
    nsName,
    hubName,
    tokenProvider,
    leaserCheckpointer,
    leaserCheckpointer)
if err != nil {
    log.Fatalf("failed to create EPH: %s\n", err)
}
defer p.Close(context.Background())

처리기 만들기Create handler

이제 처리기를 만들어 이벤트 프로세서 호스트에 등록합니다.Now create a handler and register it with the Event Processor Host. 호스트가 시작되면 이 처리기와 지정된 기타 처리기가 들어오는 메시지에 적용됩니다.When the host is started, it applies this and any other specified handlers to incoming messages:

handler := func(ctx context.Context, event *eventhubs.Event) error {
    fmt.Printf("received: %s\n", string(event.Data))
    return nil
}

// register the handler with the EPH
_, err := p.RegisterHandler(ctx, handler)
if err != nil {
    log.Fatalf("failed to register handler: %s\n", err)
}

메시지를 받는 코드 작성Write code to receive messages

모든 설정이 끝나면 Start(context) 명령으로 이벤트 프로세서 호스트를 시작하여 영구적으로 실행할 수도 있고, StartNonBlocking(context) 명령으로 메시지를 사용할 수 있는 만큼만 실행할 수도 있습니다.With everything set up, you can start the Event Processor Host with Start(context) to keep it permanently running, or with StartNonBlocking(context) to run only as long as messages are available.

이 자습서는 다음과 같이 시작 및 실행됩니다. StartNonBlocking 사용 예제는 GitHub 샘플을 참조하세요.This tutorial starts and runs as follows; see the GitHub sample for an example using StartNonBlocking:

ctx := context.Background()
err = p.Start()
if err != nil {
    log.Fatalf("failed to start EPH: %s\n", err)
}

다음 단계Next steps

다음 문서를 읽어보세요.Read the following articles: