首頁 >後端開發 >Golang >使用 Golang 中的 Log Events 和 RabbitMQ 進行事件驅動設計

使用 Golang 中的 Log Events 和 RabbitMQ 進行事件驅動設計

WBOY
WBOY原創
2024-07-23 11:30:321023瀏覽

Event-driven design with Log Events and RabbitMQ in Golang

隨著團隊追求更具適應性、可擴展性和敏捷性的解決方案來滿足當代應用程式的要求,事件驅動架構的採用正在興起。事件驅動架構透過標準化和結構化事件實現通信,支援即時更新並簡化不同系統之間的整合。

在先前的部落格文章中,我討論了 Auth0 中的 webhook 如何傳輸事件,從而利用這些事件來啟動邏輯執行。在這篇文章中,我將深入研究該架構的技術面,並示範如何利用 Go (Golang) 來建立這樣的系統。

主要部件:

讓我們先來看看驅動該系統的主要組件。

記錄事件:

Auth0 具有與租戶層級的每個活動相關的日誌事件。這些事件可用於監控或稽核目的。每個活動的程式碼可以在這裡查看

網路鉤子:

我們使用 auth0 webhooks 將過濾後的事件傳遞給我們的生產者。我們過濾這些事件,因為我們只對少數事件感興趣。

RabbitMQ

RabbitMQ 支援多種訊息傳遞協議,我們用來路由訊息的協定是高階訊息傳遞佇列協定 (AMQP)。 AMQP 有三個主要實體 – 佇列、交換器和綁定。

幕後花絮

當 Auth0 中觸發事件時,它會立即透過 webhook 發送給我們的發布者,然後發布者根據事件類型發布它。一旦發布,該事件就會進入交易所。交換器將訊息定向到連接的隊列,消費者在那裡接收訊息。為了實現這個過程,我們建立了一個管道。該通道允許我們發布訊息進行交換並聲明訂閱隊列。

為了建立一個新佇列,我們利用通道上的套件提供的 QueueDeclare 函數,指定我們所需的佇列屬性。建立隊列後,我們可以使用通道的 Publish 功能來發送訊息。

接下來,我們建立一個連接到 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 中的 Webhook 來觸發事件並使用 RabbitMQ 進行可靠的訊息排隊和傳遞,我們可以建立可擴展且響應迅速的應用程式。這種方法不僅增強了靈活性,而且支援無縫事件處理,從而能夠有效地處理非同步操作。

我希望這篇文章對您有所幫助,並且能夠對您的事件驅動之旅有所幫助。

編碼愉快:)

以上是使用 Golang 中的 Log Events 和 RabbitMQ 進行事件驅動設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Go 中的地圖下一篇:Go 中的地圖