Go에 NATS 포함

13241 단어 microservicesgo
이 기사에서는 Go 애플리케이션에 NATS 서버를 포함하는 방법을 살펴보겠습니다. 그 후에 임베디드 서비스와 외부 서비스 간의 약간의 성능 벤치마크도 수행합니다.

참고: 항상 그렇듯이 모든 코드를 사용할 수 있습니다here.

왜 이것이 필요합니까?





nats server 또는 cli 컨테이너를 사용하여 docker을 실행하는 동안 일반적으로 선호되는 방법이지만 일부 경우에는 불필요할 수 있습니다. 이러한 예는 테스트입니다. 테스트하는 동안 외부 서비스를 위해 새 인스턴스를 시작하는 것이 종종 번거롭습니다. 이는 메모리 내 서버를 사용하여 완전히 피할 수 있습니다. 운 좋게도 NATS 서버 패키지는 즉시 이 기능을 제공합니다!

설정



코드를 작성하기 전에 go 프로젝트를 빠르게 설정해 보겠습니다.

이동 모듈

$ go mod init example
$ touch main.go


종속성

$ go get -d github.com/nats-io/nats-server/v2
$ go get github.com/nats-io/nats.go


암호



설정이 끝나면 이제 옵션으로 새 서버를 초기화하여 시작할 수 있습니다.

opts := &server.Options{}
ns, err := server.NewServer(opts)

if err != nil {
    panic(err)
}


참고: Host , Port , Authorization 등을 server.Options 를 사용하여 구성할 수 있습니다.

다음으로 고루틴을 통해 서버를 시작하고 서버가 연결 준비가 될 때까지 기다립니다.

go ns.Start()

if !ns.ReadyForConnections(4 * time.Second) {
    panic("not ready for connection")
}


서버가 준비되면 서버에서 제공하는 ClientURL 기능을 사용하여 nats.go 클라이언트와 연결할 수 있습니다.

nc, err := nats.Connect(ns.ClientURL())

if err != nil {
    panic(err)
}


제목을 구독하고 메시지 데이터를 인쇄해 봅시다. 선택적으로 Shutdown 함수를 호출하여 nats 서버를 중지할 수 있습니다.

subject := "my-subject"

nc.Subscribe(subject, func(msg *nats.Msg) {
    data := string(msg.Data)
    fmt.Println(data)
    ns.Shutdown()
})


마지막으로 데이터를 주제에 게시하고 종료될 때까지 서버를 계속 실행하기 위해 WaitForShutdown를 호출합니다.

nc.Publish(subject, []byte("Hello embedded NATS!"))
ns.WaitForShutdown()


우리의 완전한 예제는 다음과 같아야 합니다!

package main

import (
    "fmt"
    "time"

    "github.com/nats-io/nats-server/v2/server"
    "github.com/nats-io/nats.go"
)

func main() {
    opts := &server.Options{}

    // Initialize new server with options
    ns, err := server.NewServer(opts)

    if err != nil {
        panic(err)
    }

    // Start the server via goroutine
    go ns.Start()

    // Wait for server to be ready for connections
    if !ns.ReadyForConnections(4 * time.Second) {
        panic("not ready for connection")
    }

    // Connect to server
    nc, err := nats.Connect(ns.ClientURL())

    if err != nil {
        panic(err)
    }

    subject := "my-subject"

    // Subscribe to the subject
    nc.Subscribe(subject, func(msg *nats.Msg) {
        // Print message data
        data := string(msg.Data)
        fmt.Println(data)

        // Shutdown the server (optional)
        ns.Shutdown()
    })

    // Publish data to the subject
    nc.Publish(subject, []byte("Hello embedded NATS!"))

    // Wait for server shutdown
    ns.WaitForShutdown()
}


빌드 및 실행!



내장된 NATS 서버를 사용하여 예제 바이너리를 빌드하고 실행해 보겠습니다.

$ go build
$ ./example
Hello embedded NATS!


보시다시피 구독자로부터 출력을 얻습니다!

성능



성능은 모든 애플리케이션의 중요한 측면이므로 NATS를 임베디드 또는 외부 서비스(cli, docker 등)로 사용할 때의 성능을 비교해 보겠습니다. 8개 간격으로 100만 개의 메시지에 대한 벤치마크를 실행할 것입니다.

설정

먼저 외부 nats 서버를 시작해야 합니다.

$ nats-server
[5868] 2022/02/22 20:09:21.073386 [INF] Starting nats-server
[5868] 2022/02/22 20:09:21.073657 [INF]   Version:  2.7.0
[5868] 2022/02/22 20:09:21.073660 [INF]   Git:      [not set]
[5868] 2022/02/22 20:09:21.073662 [INF]   Name:     NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 2022/02/22 20:09:21.073665 [INF]   ID:       NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 2022/02/22 20:09:21.076236 [INF] Listening for client connections on 0.0.0.0:4222
[5868] 2022/02/22 20:09:21.076659 [INF] Server is ready


결과

벤치마크 코드는 here 찾을 수 있으며 아래와 같이 실행할 수 있습니다.

$ go run benchmark/benchmark.go
Results have been saved to results.html


성능에 큰 차이가 없는 것 같습니다. 수백만 개의 메시지를 테스트하는 것을 고려하면 정말 인상적입니다.



결론



이 기사에서는 go 애플리케이션에 nats 서버를 포함하는 방법을 배웠습니다. 또한 작은 성능 벤치마크를 수행했습니다. official docs 을 확인하십시오.

좋은 웹페이지 즐겨찾기