>백엔드 개발 >Golang >Golang의 로그 이벤트 및 RabbitMQ를 사용한 이벤트 중심 설계

Golang의 로그 이벤트 및 RabbitMQ를 사용한 이벤트 중심 설계

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2024-07-23 11:30:321094검색

Event-driven design with Log Events and RabbitMQ in Golang

팀이 최신 애플리케이션의 요구 사항을 충족하기 위해 보다 적응력 있고 확장 가능하며 민첩한 솔루션을 추구함에 따라 이벤트 중심 아키텍처의 채택이 증가하고 있습니다. 이벤트 기반 아키텍처는 표준화되고 구조화된 이벤트를 통해 커뮤니케이션을 가능하게 함으로써 실시간 업데이트를 지원하고 다양한 시스템 간의 통합을 간소화합니다.

이전 블로그 게시물에서는 Auth0의 웹후크가 이벤트를 전송하여 이러한 이벤트를 활용하여 논리 실행을 시작하는 방법에 대해 논의했습니다. 이 글에서는 이 아키텍처의 기술적 측면을 살펴보고 Go(Golang)를 활용하여 이러한 시스템을 구축하는 방법을 보여드리겠습니다.

주요 구성 요소:

먼저 이 시스템을 구동하는 주요 구성 요소를 살펴보겠습니다.

로그 이벤트:

Auth0에는 테넌트 수준의 모든 활동과 연결된 로그 이벤트가 있습니다. 이러한 이벤트는 모니터링 또는 감사 목적으로 사용될 수 있습니다. 각 이벤트의 코드는 여기에서 확인하실 수 있습니다

웹훅:

우리는 auth0 웹후크를 사용하여 필터링된 이벤트를 생산자에게 전달합니다. 우리는 소수의 이벤트에만 관심이 있으므로 이러한 이벤트를 필터링합니다.

RabbitMQ

RabbitMQ는 여러 메시징 프로토콜을 지원하며 메시지 라우팅에 사용하는 프로토콜은 AMQP(Advanced Messaging Queuing Protocol)입니다. AMQP에는 대기열, 교환 및 바인딩이라는 세 가지 주요 엔터티가 있습니다.

비하인드 스토리

Auth0에서 이벤트가 트리거되면 웹훅을 통해 게시자에게 즉시 전송되고 게시자는 이벤트 유형에 따라 게시합니다. 게시되면 이벤트가 교환됩니다. 교환은 소비자가 메시지를 수신하는 연결된 대기열로 메시지를 전달합니다. 이 프로세스를 활성화하기 위해 채널을 설정합니다. 이 채널을 통해 메시지를 게시하여 구독 대기열을 교환하고 선언할 수 있습니다.

새 대기열을 생성하려면 채널의 패키지에서 제공하는 QueueDeclare 함수를 활용하여 원하는 대기열 속성을 지정합니다. 대기열이 생성되면 채널의 게시 기능을 사용하여 메시지를 보낼 수 있습니다.

다음으로 RabbitMQ에 연결하고 통신 채널을 구축하는 소비자를 만듭니다. 이 채널을 사용하면 정의된 Consume 메소드를 사용하여 메시지를 소비할 수 있습니다.

기초

로그 이벤트 작업에는 golang-auth0 관리 패키지를 사용하고, 대기열 작업에는 github.com/rabbitmq/amqp091-go를 사용합니다.

아래는 스니펫입니다.

출판:

로그의 자세한 구조는 여기에서 확인하세요

    for _, auth0log := range payload.Logs {

        switch auth0log.Data.Type {
        case "slo":
            _, err = c.Publish(ctx, PublishRequest{
                ---your logic---
            })

        case "ss":
            _, err = c.Publish(ctx,PublishRequest{
                    -- your logic -----
                })

        }
    }

교환:

    if consumeOptions.BindingExchange != "" {
        for _, routingKey := range routingKeys {
            err = consumer.chManager.channel.QueueBind(
                queue,
                routingKey,
                consumeOptions.BindingExchange,
                consumeOptions.BindingNoWait,
                tableToAMQPTable(consumeOptions.BindingArgs),
            )
            if err != nil {
                return err
            }
        }
    }

태워 버리는:

func (c *Client) Consume() {
    err := c.consumer.StartConsuming(
        func(ctx context.Context, d queue.Delivery) bool {
            err := c.processMessages(ctx, d.Body, d.Exchange)
            if err != nil {
                c.log.Error().Ctx(ctx).Err(err).Str("exchange", d.Exchange).Msg("failed publishing")
                return nack // send to dlx
            }
            return ack // message acknowledged
        },
        c.queueName,
        []string{c.queueRoutingKey},
        func(opts *queue.ConsumeOptions) {
            opts.BindingExchange = c.queueBidingExchange
            opts.QueueDurable = true
            opts.QueueArgs = map[string]interface{}{
                "x-dead-letter-exchange": c.queueBidingExchangeDlx,
            }
        },
    )
    if err != nil {
        c.log.Fatal().Err(err).Msg("consumer: Failed to StartConsuming")
    }

    // block main thread so consumers run forever
    forever := make(chan struct{})
    <-forever
}   

따라서 Auth0의 웹후크를 활용하여 이벤트를 트리거하고 안정적인 메시지 대기열 및 전달을 위해 RabbitMQ를 사용함으로써 확장 가능하고 응답성이 뛰어난 애플리케이션을 구축할 수 있습니다. 이 접근 방식은 유연성을 향상시킬 뿐만 아니라 원활한 이벤트 처리를 지원하므로 비동기 작업을 효율적으로 처리할 수 있습니다.

이 기사가 귀하의 이벤트 중심 여정에 도움이 되기를 바랍니다.

행복한 코딩하세요 :)

위 내용은 Golang의 로그 이벤트 및 RabbitMQ를 사용한 이벤트 중심 설계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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