隨著團隊追求更具適應性、可擴展性和敏捷性的解決方案來滿足當代應用程式的要求,事件驅動架構的採用正在興起。事件驅動架構透過標準化和結構化事件實現通信,支援即時更新並簡化不同系統之間的整合。
在先前的部落格文章中,我討論了 Auth0 中的 webhook 如何傳輸事件,從而利用這些事件來啟動邏輯執行。在這篇文章中,我將深入研究該架構的技術面,並示範如何利用 Go (Golang) 來建立這樣的系統。
讓我們先來看看驅動該系統的主要組件。
Auth0 具有與租戶層級的每個活動相關的日誌事件。這些事件可用於監控或稽核目的。每個活動的程式碼可以在這裡查看
我們使用 auth0 webhooks 將過濾後的事件傳遞給我們的生產者。我們過濾這些事件,因為我們只對少數事件感興趣。
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中文網其他相關文章!