随着团队追求更具适应性、可扩展性和敏捷性的解决方案来满足当代应用程序的要求,事件驱动架构的采用正在兴起。事件驱动架构通过标准化和结构化事件实现通信,支持实时更新并简化不同系统之间的集成。
在之前的博文中,我讨论了 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中文网其他相关文章!