ホームページ  >  記事  >  バックエンド開発  >  Golang の Log Event と RabbitMQ を使用したイベント駆動型の設計

Golang の Log Event と RabbitMQ を使用したイベント駆動型の設計

WBOY
WBOYオリジナル
2024-07-23 11:30:321015ブラウズ

Event-driven design with Log Events and RabbitMQ in Golang

チームが現代のアプリケーションの要件を満たすために、より適応性、拡張性、機敏なソリューションを追求するにつれて、イベント駆動型アーキテクチャの採用が増加しています。イベント駆動型のアーキテクチャは、標準化され構造化されたイベントを介した通信を可能にすることで、リアルタイムの更新をサポートし、さまざまなシステム間の統合を合理化します。

前回のブログ投稿では、Auth0 の Webhook がどのようにイベントを送信し、これらのイベントを利用してロジックの実行を開始するかについて説明しました。この記事では、このアーキテクチャの技術的側面を詳しく掘り下げ、そのようなシステムを構築するために Go (Golang) をどのように利用できるかを示します。

主なコンポーネント:

まず、このシステムを駆動する主なコンポーネントを見てみましょう。

イベントのログ:

Auth0 には、テナント レベルのすべてのアクティビティに関連付けられたログ イベントがあります。これらのイベントは、監視または監査の目的で使用できます。各イベントのコードはここで確認できます

Webhook:

auth0 Webhook を使用して、フィルターされたイベントをプロデューサーに配信します。関心があるのはほんの一握りであるため、これらのイベントをフィルタリングします。

ラビットMQ

RabbitMQ は複数のメッセージング プロトコルをサポートしており、メッセージのルーティングに使用するプロトコルは Advanced Messaging Queuing Protocol (AMQP) です。 AMQP には、キュー、エクスチェンジ、バインディングという 3 つの主要なエンティティがあります。

舞台裏

Auth0 でイベントがトリガーされると、そのイベントは Webhook 経由でパブリッシャーに即座に送信され、パブリッシャーはイベント タイプに基づいてイベントをパブリッシュします。公開されると、イベントは交換に移ります。交換はメッセージを接続されたキューに送り、そこでコンシューマがメッセージを受信します。このプロセスを可能にするために、チャネルを確立します。このチャネルを使用すると、メッセージを公開して交換し、サブスクリプションのキューを宣言できます。

新しいキューを作成するには、チャネル上のパッケージによって提供される 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 の Webhook を活用してイベントをトリガーし、信頼性の高いメッセージのキューイングと配信に RabbitMQ を採用することで、スケーラブルで応答性の高いアプリケーションを構築できます。このアプローチにより、柔軟性が向上するだけでなく、シームレスなイベント処理もサポートされ、非同期操作の効率的な処理が可能になります。

この記事が役に立ち、イベント主導型の旅に有益であることが証明できれば幸いです。

コーディングを楽しんでください:)

以上がGolang の Log Event と RabbitMQ を使用したイベント駆動型の設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Goの地図次の記事:Goの地図