首页 > 后端开发 > Golang > 使用 Golang 中的 Log Events 和 RabbitMQ 进行事件驱动设计

使用 Golang 中的 Log Events 和 RabbitMQ 进行事件驱动设计

WBOY
发布: 2024-07-23 11:30:32
原创
1076 人浏览过

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板