팀이 최신 애플리케이션의 요구 사항을 충족하기 위해 보다 적응력 있고 확장 가능하며 민첩한 솔루션을 추구함에 따라 이벤트 중심 아키텍처의 채택이 증가하고 있습니다. 이벤트 기반 아키텍처는 표준화되고 구조화된 이벤트를 통해 커뮤니케이션을 가능하게 함으로써 실시간 업데이트를 지원하고 다양한 시스템 간의 통합을 간소화합니다.
이전 블로그 게시물에서는 Auth0의 웹후크가 이벤트를 전송하여 이러한 이벤트를 활용하여 논리 실행을 시작하는 방법에 대해 논의했습니다. 이 글에서는 이 아키텍처의 기술적 측면을 살펴보고 Go(Golang)를 활용하여 이러한 시스템을 구축하는 방법을 보여드리겠습니다.
먼저 이 시스템을 구동하는 주요 구성 요소를 살펴보겠습니다.
Auth0에는 테넌트 수준의 모든 활동과 연결된 로그 이벤트가 있습니다. 이러한 이벤트는 모니터링 또는 감사 목적으로 사용될 수 있습니다. 각 이벤트의 코드는 여기에서 확인하실 수 있습니다
우리는 auth0 웹후크를 사용하여 필터링된 이벤트를 생산자에게 전달합니다. 우리는 소수의 이벤트에만 관심이 있으므로 이러한 이벤트를 필터링합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!